{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Counterfactual instances on MNIST"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Given a test instance $X$, this method can generate counterfactual instances $X^\\prime$ given a desired counterfactual class $t$ which can either be a class specified upfront or any other class that is different from the predicted class of $X$.\n",
    "\n",
    "The loss function for finding counterfactuals is the following: \n",
    "\n",
    "$$L(X^\\prime\\vert X) = (f_t(X^\\prime) - p_t)^2 + \\lambda L_1(X^\\prime, X).$$\n",
    "\n",
    "The first loss term, guides the search towards instances $X^\\prime$ for which the predicted class probability $f_t(X^\\prime)$ is close to a pre-specified target class probability $p_t$ (typically $p_t=1$). The second loss term ensures that the counterfactuals are close in the feature space to the original test instance.\n",
    "\n",
    "In this notebook we illustrate the usage of the basic counterfactual algorithm on the MNIST dataset."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-info\">\n",
    "Note\n",
    "    \n",
    "To enable support for Counterfactual, you may need to run\n",
    "    \n",
    "```bash\n",
    "pip install alibi[tensorflow]\n",
    "```\n",
    "\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TF version:  2.2.0\n",
      "Eager execution enabled:  False\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "os.environ[\"TF_USE_LEGACY_KERAS\"] = \"1\"\n",
    "\n",
    "import tensorflow as tf\n",
    "tf.get_logger().setLevel(40) # suppress deprecation messages\n",
    "tf.compat.v1.disable_v2_behavior() # disable TF2 behaviour as alibi code still relies on TF1 constructs  \n",
    "from tensorflow.keras.layers import Conv2D, Dense, Dropout, Flatten, MaxPooling2D, Input\n",
    "from tensorflow.keras.models import Model, load_model\n",
    "from tensorflow.keras.utils import to_categorical\n",
    "import matplotlib\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import os\n",
    "from time import time\n",
    "from alibi.explainers import Counterfactual\n",
    "print('TF version: ', tf.__version__)\n",
    "print('Eager execution enabled: ', tf.executing_eagerly()) # False"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load and prepare MNIST data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "x_train shape: (60000, 28, 28) y_train shape: (60000,)\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()\n",
    "print('x_train shape:', x_train.shape, 'y_train shape:', y_train.shape)\n",
    "plt.gray()\n",
    "plt.imshow(x_test[1]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Prepare data: scale, reshape and categorize"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "x_train shape: (60000, 28, 28, 1) x_test shape: (10000, 28, 28, 1)\n",
      "y_train shape: (60000, 10) y_test shape: (10000, 10)\n"
     ]
    }
   ],
   "source": [
    "x_train = x_train.astype('float32') / 255\n",
    "x_test = x_test.astype('float32') / 255\n",
    "x_train = np.reshape(x_train, x_train.shape + (1,))\n",
    "x_test = np.reshape(x_test, x_test.shape + (1,))\n",
    "print('x_train shape:', x_train.shape, 'x_test shape:', x_test.shape)\n",
    "y_train = to_categorical(y_train)\n",
    "y_test = to_categorical(y_test)\n",
    "print('y_train shape:', y_train.shape, 'y_test shape:', y_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "xmin, xmax = -.5, .5\n",
    "x_train = ((x_train - x_train.min()) / (x_train.max() - x_train.min())) * (xmax - xmin) + xmin\n",
    "x_test = ((x_test - x_test.min()) / (x_test.max() - x_test.min())) * (xmax - xmin) + xmin"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Define and train CNN model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def cnn_model():\n",
    "    x_in = Input(shape=(28, 28, 1))\n",
    "    x = Conv2D(filters=64, kernel_size=2, padding='same', activation='relu')(x_in)\n",
    "    x = MaxPooling2D(pool_size=2)(x)\n",
    "    x = Dropout(0.3)(x)\n",
    "    \n",
    "    x = Conv2D(filters=32, kernel_size=2, padding='same', activation='relu')(x)\n",
    "    x = MaxPooling2D(pool_size=2)(x)\n",
    "    x = Dropout(0.3)(x)\n",
    "    \n",
    "    x = Flatten()(x)\n",
    "    x = Dense(256, activation='relu')(x)\n",
    "    x = Dropout(0.5)(x)\n",
    "    x_out = Dense(10, activation='softmax')(x)\n",
    "    \n",
    "    cnn = Model(inputs=x_in, outputs=x_out)\n",
    "    cnn.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n",
    "    \n",
    "    return cnn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"model\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_1 (InputLayer)         [(None, 28, 28, 1)]       0         \n",
      "_________________________________________________________________\n",
      "conv2d (Conv2D)              (None, 28, 28, 64)        320       \n",
      "_________________________________________________________________\n",
      "max_pooling2d (MaxPooling2D) (None, 14, 14, 64)        0         \n",
      "_________________________________________________________________\n",
      "dropout (Dropout)            (None, 14, 14, 64)        0         \n",
      "_________________________________________________________________\n",
      "conv2d_1 (Conv2D)            (None, 14, 14, 32)        8224      \n",
      "_________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2 (None, 7, 7, 32)          0         \n",
      "_________________________________________________________________\n",
      "dropout_1 (Dropout)          (None, 7, 7, 32)          0         \n",
      "_________________________________________________________________\n",
      "flatten (Flatten)            (None, 1568)              0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 256)               401664    \n",
      "_________________________________________________________________\n",
      "dropout_2 (Dropout)          (None, 256)               0         \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 10)                2570      \n",
      "=================================================================\n",
      "Total params: 412,778\n",
      "Trainable params: 412,778\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "cnn = cnn_model()\n",
    "cnn.summary()\n",
    "cnn.fit(x_train, y_train, batch_size=64, epochs=3, verbose=0)\n",
    "cnn.save('mnist_cnn.h5')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Evaluate the model on test set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test accuracy:  0.9871\n"
     ]
    }
   ],
   "source": [
    "cnn = load_model('mnist_cnn.h5')\n",
    "score = cnn.evaluate(x_test, y_test, verbose=0)\n",
    "print('Test accuracy: ', score[1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Generate counterfactuals"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Original instance:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "X = x_test[0].reshape((1,) + x_test[0].shape)\n",
    "plt.imshow(X.reshape(28, 28));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Counterfactual parameters:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "shape = (1,) + x_train.shape[1:]\n",
    "target_proba = 1.0\n",
    "tol = 0.01 # want counterfactuals with p(class)>0.99\n",
    "target_class = 'other' # any class other than 7 will do\n",
    "max_iter = 1000\n",
    "lam_init = 1e-1\n",
    "max_lam_steps = 10\n",
    "learning_rate_init = 0.1\n",
    "feature_range = (x_train.min(),x_train.max())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Run counterfactual:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Explanation took 8.407 sec\n"
     ]
    }
   ],
   "source": [
    "# initialize explainer\n",
    "cf = Counterfactual(cnn, shape=shape, target_proba=target_proba, tol=tol,\n",
    "                    target_class=target_class, max_iter=max_iter, lam_init=lam_init,\n",
    "                    max_lam_steps=max_lam_steps, learning_rate_init=learning_rate_init,\n",
    "                    feature_range=feature_range)\n",
    "\n",
    "start_time = time()\n",
    "explanation = cf.explain(X)\n",
    "print('Explanation took {:.3f} sec'.format(time() - start_time))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Results:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Counterfactual prediction: 9 with probability 0.9924006462097168\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "pred_class = explanation.cf['class']\n",
    "proba = explanation.cf['proba'][0][pred_class]\n",
    "\n",
    "print(f'Counterfactual prediction: {pred_class} with probability {proba}')\n",
    "plt.imshow(explanation.cf['X'].reshape(28, 28));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The counterfactual starting from a 7 moves towards the closest class as determined by the model and the data - in this case a 9. The evolution of the counterfactual during the iterations over $\\lambda$ can be seen below (note that all of the following examples satisfy the counterfactual condition):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzwAAABmCAYAAAAOC5TiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOy9aXBk13Um+N3c9wWZWApAoQCQtbHIYhXFEilxlcWiLMuWLEthy+PusSeme2x32OFZOmTHjCLGMW1LdrhjenraPZ4ZeVF3W5ZNyU2rSWlsUaKohWuJ5WKRtW+owr4kcgFyX978SHy3Tj68BDKBBEmB+UUgCpV4+d6955179nuuMgwDXXTRRRdddNFFF1100UUXuxG2d3oAXXTRRRdddNFFF1100UUXO4Wuw9NFF1100UUXXXTRRRdd7Fp0HZ4uuuiiiy666KKLLrroYtei6/B00UUXXXTRRRdddNFFF7sWXYeniy666KKLLrrooosuuti16Do8XXTRRRdddNFFF1100cWuxY+tw6OUWlVKjb/T4/hxR5eOnUOXlp1Bl46dQZeOnUOXlp1Bl46dQ5eWnUGXjp3BjwMdt+TwKKUmlFJPrP3+K0qpH3Z2WOue94JS6p/JzwzDCBiGcX0nn7v27B6l1NNKqaxS6qZS6r/q4L3fS3T8DaXUj5RSRaXUl3bg/u8JWiql3EqpP1vjxRWl1Bml1Ec7eP/3BB3Xnv2XSqlZpVRGKXXZPI5t3vs9Q0cxhv1KqYJS6i87fN/3DC3Xnl1YMx5WlVKXOnjv9wwd157/GaXUhTXdfU0p9UgH7/2eoaXgRf5UlVL/rkP3fi/RcVQp9U2lVFIpNaeU+mOllKND934v0fGwUup5pVRaKXVVKfXJVr/7jmd4OvXCdxD/HkAJQD+AXwLwJ0qpI+/skNbjx4COMwB+D8Cfv9MD2Qzvclo6AEwCeAxAGMDnADyllBp9B8dkiXc5HQHgCwBGDcMIAfg4gN9TSr3vHR7TOvwY0JH49wBOvdOD2Ag/JrT8jTXjIWAYxsF3ejBWeLfTUSl1EsAfAvhvAAQBPArgbXP+28G7nZaCFwMABgDkAXz1HR7WOrzb6Qjg/wKwAGAPgGOo6/B/8Y6OyALvZjquje3rAJ4F0APgvwPwl0qpAy3dwDCMtn8ATAB4AsBhAAUAVQCrAFJrf3cD+NcAbgGYB/B/A/Cu/e1xAFMAfhvAHID/BCC6NoFFAMm134fXrv/9tfsX1p7xx2ufGwDuXPs9DOA/rn3/JupGoG3tb78C4Idr40kCuAHgoy3O04+6s3NAfPafAPzBVuj2XqWjac6/B+BLnaDfe52WYu5nAXyqS8et0xHAQQCzAH6+S8f26QjgMwCeAvC7AP6yu7a3RksALwD4Z52k33uUji8B+G93go7vNVqa5v3LqDuOqkvHtnnyAoCfEv//IwD/T5eObdnkd689U4nPvgXgX7X0/e0QVw7e9Pd/A+C/oO6BBQE8A+ALgrgV1KMvbgBeADEAnwLgW7v+qwD+TtzvBZiUgIm4/xF1ry8IYBTAZawJu7XxlQH8cwB2AL+OerZBrf39dwA822SexwHkTJ/9SwDPdJJJdzsdTc/bUYfnvUTLtWv7URc8h7p0bJ+OqEfdcmvPPA0g0KVje3QEEFq73zB20OF5j9DyBdSNhCUALwJ4vEvHtvW2HfVA5e8AuIq6MffHWDPwurTclr55HsDvdum4pbX9q2v39wEYAvAWgE926djW2rZyeJ4D8HRLdOo0cQEoAFkAd4jPPgDghiBuCYBng/sfA5Bshbi4LdzuMjHWC2J8V8XffGvfHWhhno8AmDN99s95751k0t1ER9Pz3naHZxfT0gng2+hQlOg9TEc7gIdRj0I5u3Rsj44A/i2A3177/XfxNjo8u5CWD6BuJLhRj6avyLl16diS3h5cu/ZHqJcPxVF3Hn+/y5PbkpP7UI/sj3XpuKW1fRjA66g7FwaAL6HDmbLdTkfUbZ7rAD679vuTa8/6h1botBO1er1rE3hdKcXP1BoRiEXDMAr6j0r5UPdAfxL1VBoABJVSdsMwqps8L476xG+Kz26i7kETc/zFMIzc2rgCLcxlFfXopUQIdSW009hNdHynsetoqZSyoZ56LgH4jVa/t03sOjqufa8K4IdKqX+CerTp/2zn+1vArqGjUuoY6qUUxze7doewa2i5dv2r4r//QSn1iwB+CkBHNolvgN1Ex/zav//OMIzZtbH+76gHNP6XFr6/XewmWkr8U9QN6Rttfm+r2DV0XNPXfw/g/wXwwbXv/DnqWZXPbvb9bWLX0NEwjLJS6mdRl4e/jXpQ4ykAxc2+C3SmaYFh+v8S6gLniGEYkbWfsFHf8NbsO/8T6jX0Dxj1DcSPrn2umlxvfl4Z9egDMQJguo05NMNlAA6l1H7x2b0AznXg3mbsZjq+3djVtFR16fBnqJezfcowjHIn7muBXU1HCzgA3LED993NdHwc9ZKFW0qpOdRLfj+llDrdgXtbYTfT0gqGGFen7yuxa+hoGEYS9TI2+fyNxrLtR5r+v2toacJ/DeA/dPieEruZjj1r9/pjwzCKhmEkAPwF6sGMTmM30xGGYZw1DOMxwzBihmF8BMA4gNda+W4nHJ55AMNKKdfaYGoAvgjg3yil+gBAKTWklPrIBvcIov5CUkqpHgD/q8UzLPt7r3mbTwH4faVUUCm1D8D/CGDbrVENw8gC+M8A/jellF8p9RCAT6AeWe80di0dgXp3DaWUB/Wogl0p5dnBbiC7mpYA/gT19PjPGIaR3+zibWDX0lEp1afqbWsDSin72hx+EcB3tntvC+xaOqIesbwD9ZKHY6hvhv0GgI3msh3sWloqpSJKqY9QNiqlfgl1Q+Pvt3tvC+xaOq7hLwD85to6jwL4H1DfeL0T2O20hFLqg6hH6HeyO9uupaNhGEuob87/9bW1HUG9ZPXsdu9tgV1LRwBQSh1dk5E+pdS/RL1s9UutfLcTDs/zqGc85pRSS2uf/TbqmwVfUUplUN9nsFF7zf8D9Y1SSwBewXoB/28BfFrV+5dblZv8Juo1itdR7/7wV2ix/bFS6n9WSv1/G1zyL9bGtgDgKwB+3TCMncjw7HY6fg71BfQ7AP7J2u+fa+XeW8CupeWa8PhV1I3LOXX7bIRfauXebWLX0hH1CNWvox4JTqLeMea/Nwzjv7Ry7zaxa+loGEbOMIw5/qBeBlwwDGOxlXtvAbuWlqiXgfwebjct+E0AP2sYxuVW7t0mdjMdAeBfod4i/TLq3bH+EfXuUjuB3U5LoG6c/2fDMHaynH+30/HnUC8RW0R9TmXUHfFOY7fT8Z+i3lF1AcCHAZw0DKOlkjZ2Reiiiy666KKLLrrooosuuth1eMcPHu2iiy666KKLLrrooosuutgpdB2eLrrooosuuuiiiy666GLXouvwdNFFF1100UUXXXTRRRe7Fl2Hp4suuuiiiy666KKLLrrYteg6PF100UUXXXTRRRdddNHFrkVb56B4PB4jEAggm82iUCjA6XQiHA7DZrNhdXUVuVxOX2uz2eDxeOByuVAqlZDP52HVEc5msyEUCsHtdiOXy2F1ddXyOpfLhZ6eHrjd7oa/K6VgGAaSySRWVtrvmKiUgs/ng9PpRLFYRKFQgFIKfr8fLpcLdrsddrsdlUoF6XQapVIJoVAIoVAIyWQSq6urbR8KZ7PZDI7bPFelFJr9rdn4lVKw2WxwuVyw2Wwol8soFovrrrPZbHA4HAgGg3A6nfpv1WoVxWIR1WoVpVIJpVKp3SltCpfLBa/Xi1qthkKhgGq1Cq/XC6/XC6UUFhcXlwzD6G33vkqpHWkzaLPZoFTjq61Wq3wmbDYbDMNArVbTn/F6fvZ2gmOq1Wqo1Wpt8+RGdCQt5HytPtvqmM10tNnqcRjyv/k9AHUavw0dJtvmyU7yo6QP52qWfe3ICsnTpLekseRh/m2jd7sRD9hsNv0eK5XKjq9t8/g5r3Z5c6O13SqddwLi+Vte23JtmdFMlkl+MQxjHU92ih6b8V+r8maj6+T8q9Xqu0rfbAdmXbUdmWwFqzUhsRWetNlsBvWVlQ200fM6ge2safMakvfYil4UMqttnrTZbIbdbqfeXzfOjcYi9WwzGiilYLfb9T02opV5Dcvr5VjknOV15vUvYR6jWc6b0JSObTk8gUAAH/vYx3D69GmcO3cO/f39eOKJJxAIBPDDH/4QZ86cQX9/P+699174/X54PB643W5MTEzg1VdfRT6//oxEv9+PRx99FPv27cPZs2fx0ksvAQD6+/vh8/kQj8fR19cHpRQqlcq6F2uz2VCtVnHx4sUtOTw+nw8PPfQQRkdHcf78ebz2Wv3A1lgshlAoBJfLBY/Hg3w+jytXrqBcLiMej2N8fFxfuxU4nU5LI4YOlmEYqFarMAxDzxtY/6KVUnA4HHA6nYjFYvB6vchkMkgmk6hWq6hUKjAMAz09Pejt7YXD4UAgENDfoaO3tLSEQqGAZDKJdDrdMCYrxbGZkDCPk++yUqlgaWkJpVIJkUgEvb29sNlsWFxcvLllYnYQXHQOh0M7iE6nE7VaDdlsFpVKBXa7HQ6HA4ZhoFQqwTAM2Gw2UPC8E4YRx2R2dDt1b7vd3mAEOZ1O2O12lEolZLPZLc2XY+Y9CUlPGs7mv+dyORSLRdjtdjidzoaxVSqVbTntgnffUZ50OBzweDxQSmm+4ppWSumATLFYbOm9u91uuN1uAGiQLdVqFQ6HAy6Xq8EIqNVq+rpSqbRO7jJQVKlUtIwql8uo1Wqw2+1wuVwAgEqlsmU6mhWgFZ9xzZJf5LVSdrYCBmYMw9BzIe1Jj7cb0jjbDrjeZHCM9yyXy8jlcqjVanrNORwOzS+5XA6lUkl/Lt8LeRJY75BvNman06nHZF7H1WoV5XJZX0dez+VyTYOn5MlqtYpqtYparYZisah5kvKmWq3uKE+2ey/eg/qGn8k1bwXSTeoqXs/12Oy7rYLPkGtiu2Cgm7JDwuFw6CAzeXIzbGIAr7uW+kwa4lzbMlhD8F2Y+ZRygXNwu92aT5sF+c1j2Y6+sdvtiEQi+j3XajVtk3i9XrjdbpTLZWSz2QY6Sr0pdYtZvrlcLvh8PgDQ775cLut1Ke9nli3ULZLOcu1IuvM6u93ecF8pc6mLrJwirvU1NKVj2yfdyxfIBSAXVTwexyOPPIJIJIKFhQWk02kdxW+GcrmMUqmkJ+Z0OjEwMIBYLIb9+/fjrrvuwszMDP7qr/4KExMTlvfY6iK02WwIBoPo6elBMBiEUgrFYhETExNNBdv169dx48aNLQs6wzBQLBbhcrm0IOHLlIwhPetmDg8ZvFKpIJFIaOOczEeG8Xq9iMViyOfzOH/+PFZXV+F2u+HxeBqeT0Y2e+Pm997KHCVSqdQ6R2p6ehozMzNboqEVrBRsu4YCBVu5XNbvQWbDAFgKaSth8XbCakydAte40+mE3+9vGiVuFxyz3W6H3++Hw+FAPp9HoVCA3W6Hz+fbUG4AtzPJckylUgnlcnlb6/PdAOk405in0mmmRFq5nxVPSyVPXrbZbHC73VqGmGUsZROvk4aZlVLcCqRMbBZIkA5aJ0AauVwuLasLhUJH7r3V8XSCJ7nepFFtBWmANPubzWaD1+uFw+HQ6w1o1E+tjJlOvRUYaGnnftIwtdvt2mmiUdoJGSmj0dt9L2YHUdKDhmixWNTjbqb/pa6SQVNpjLfjFEjspG5zOBzaCd0O2tXxpInH44HH42lwFOiEy+tpg5mdIXNWo1VZLO+9HR7i951OJ1wul7alpe3WrEKCgTPaigwymO9fqVS0jFdKIZ/PW8p2GcA3DEPLGd7DnMXh9Qy8S+eG45FZIikL5HWcZytoi9PMUbRSqYTl5WUUi0U4HA709fXB7/cjl8vBbrcjn89rY3zdg9ciimS2YrEIp9OpszmlUgnJZBKzs7Nwu91YWlrS3n44HEY4HEapVEIikdhUsdLrlATkC6/VasjlclhZWVnnkcvfXS4Xent74fV6tTd77dq1dsi3DjKCKh0aRh8otKRD2SyyJb1lMj8NEAp9liJy3m63G6FQCOVyGSsrK/pzMiYZjGPcCmR03uzdh0IhBINB2Gw2XL9+fUv3l2hmDLULuSBltIz3otCTC09+1yojYY4ebfRdYGslW51QwBtBCj+Z8Wk2FqB5uYUUflapdemEU+bI78qSLI6JeCcdTyoQs4PQLJpo/juwvnyIcks6HrKsiFFHmY2w4jPKPKm0SUuOS74TKkDJ9/IdyRJP3p/fle99u46P5IntoBWetPrMqtyS/7da21blJdtFJ9c214wco5WMNxvL0ggkT/I+7Rp6VmMivSlbJG3NPNfsHtJR4z2Y/ZDvuBO07LSsNTsoZv7bbBzSiCWfymoEM4/L6+QabqcUa7s0sArmmtdZq2MB0CCr5JyaBW8lD8tMh9U4ZWBFyjlz5lfyMWWqhPldbNURNY+Pc2nlPtLO5LM5VqkHzA4dcNuelvarHAd1lJWzxedIPSLft1zvUu+ZdSHHKUteeY+N9E3bDg/TVQCwurqK8+fPw+PxoLe3F+9///vhdDoxOTmpS83oUJgXEUucvF4vKpUKUqkUwuEwTpw4gVwuhwsXLmB5eRlXr17Vabl0Og2bzYaDBw/ife97HxYWFvDCCy8gkUhsOG63241YLKZLcKrVKgqFAlZWVlCtVjE/Pw8AWFpaarrYw+EwnnjiCezduxeBQAB+vx9/9Ed/1A75GsCFIktR+FLdbreO9DCFyOvMzEyBJpkjFAphYGBARyZZdjQ/P49KpaKzF7FYDOPj48hkMrhw4ULDM1jOoJRCoVBoK63Me8iIkzSCOM+jR4/i2LFjcDgc26JlK2hFqJijD2ZnkzRwOp3weDyoVqvI5/MNhp/dbtcZB96rUqkgn89rJ5ORGLODLcuAuKeqVZC+24lgbqbAOF+lFLxeb9MosRSmTPETtVoN+XxeZ3ZkGZUUnrVaTe+nYyaUe82ksmDZg5n3dtLx2wjMGOdyOZ0VIC04j2bvnpFdBiVkKUmxWNRlehT0dDxJx2q1ilwup4MezLqQ98jLjGDSoZEKgoYtjeJisdiwlqVyN5cN8rsMZpE/NpPPm9GzFaNvM0ieZCkgPzevY+A2/5mdGeo/yopKpaLlo8vl0mu7UCh0jAc7vbblOm4W4ANury3qJFYDANC6S5as8PN25821T5px76/8TBqcze5vXidAfV253W5NP2Z+d1JOtnOfjfQNsdE7kp8Xi0WUy2VtO5BfpcyRIG2kMcn91puhEzwJoGHPMHlIVr60AisHiTJIrmNeJ+WJVTDZHMjh36TzQh1Ip0ZmVfh8liObDX8pb6ShvhVa8t6FQqFhrWwWgJCleQyKMzgA3K4o4L+S56U+Zpm/dAal02W2ifgs6dj7fD7tL8gtAtIu4HgdDoe+h3xX3A8ObKxv2nJ4zA/nAiEB/X6/XnicrKwTli+INYSs1SwUCvB4PPD7/Tq9mM1mtTHDH5bVRCIR5PN5Xb9qvj8VGQ0D1oVKj5AE5SKXil+WhNVqNTidToRCIUSjUd20YDupWDooMpIrnQL5/82iHVLZ8P80NqjkSWPJ2HRqKFzMAsZqsZr/bvUdM7PLlKl0eHw+H6LR6Lq6zXcSVpEGqzlKg8n8r9m5kxEs89/N9243RWse13YjrRtBrv9Wo0gUmuYxSiVrVvoE6cY1aBVRkte9G0DeMGcRJC2ofM1ykXSSPGCmjdn4ofyQ0UT5LKmkpVIyf241D+C2Acs1LKOA5vGYx/1uWteEFU8Ct/eCAo10kpFKq7Vt1j2tyOutjruTa7vVNWPO+FutPclr7ULykdmpke+g1SDGRvLaypB9p2HOmm4nWEP5LGWL1GdWMoe8bLWnZTN0gic5Zv4uZUu7MNsezXTpZsExM43kZ/L+crxWGeJmul7K3k7BagwbwWzbNatGsBqnlf3DMcj3Ka83j1U6ZlY6yupHjtmKnmada4W2LPZsNotTp07B5XLhvvvug9frRTweh81mw/T0NM6cOYNoNIo77rgDXq8XwWAQHo9Hl7zZ7XbEYjEEAgFdjgYAy8vL2vjm9dlsFkA9sxKLxeBwOHTNcK1Ww5kzZ1AoFHRjAb5sr9eL/v5+KKVw/fp1zMzM6NI7OjCMpJBQHo9Hd10D6h7nXXfdhd7eXiQSCSwsLMDhcOC1117D2bNn4XK54Ha7txy5VEo1jNnv92PPnj1wOp1YXFxEKpXStdF8sV6vV3vA5nuZlS/nW61W9V4IwzB0VI+Rh3Q6jfPnz6NQKKzb9CzT42blqJTSjpLMPkkHtlwuw263IxqNwu/3o1Ao6EwfaX/x4kUkk8l3jQJixAu4Ldg4F/kZYbPZGrJwjDwUCgXtdMosCJ1rOuJWxkOxWNSOvcvlankDPgXNdiKPmxnBQOvGQjODSvIOAxuMIDczFmVJ1kYg/zFrwXVGntyJ7oNWMAxDZwJkJBxobiQYhrGuppqlcQAaIrXMusjInIy+AdCZdQANfGgYRoOxz4CR3C/BPQOyLI/jkcpGGlWyfI7f69Qeno0cMl7DuZBmVu/azD9SmbpcLp3ZkplFpVTD2pYb980ZTtnkQAboyJOyfLmdddrptc3/S8hsqwwwmKPOfPdcswx88nvNMtPNjGhZ20/ZS97dCq2s5k15bC492s49m4HGoNzYDqAhek1IfcN5dmKfEbMazPCYm0zIMfE6VpW0ik7wpNU9aZtxDTGruFHzBfKJhGyuIB0qGXxs1YE2w+wsUNfLgByrEfgOpF0k+dBq7O2A36d9LEHZ3uzd027jWqcekA4wKzLII+bgJecm5ZsVvWTwXlb8ALf35jCZQbvAKtNJ2SOzd4Zh6MqPjjo8+Xwe586dw/Hjx3HkyBH4/X709/ejVqthamoKly9fxsjICA4dOoRgMIi+vj6Ew2EsLi7qCUajUcTjcczPz2Nubq5hUizDoJACgGAwiD179sDj8SASicDhcGBmZgZXrlyB3W5HIBBAKBTSTNTT04MDBw7AZrMhlUphZmamYQOt9Lalw+P3+3V61+Px4NChQxgfH8fExARsNpsu39tKJzgz+MLIIIFAAPv27YPH40E2m8XMzIxeILKUgvOwimDJH5b/8Vler1dvBmeq1el0YmVlBXNzc5ZjlJ661YJkNyOWzBmGoctZKKDsdjuCwSAikQhSqZQu/aBQn5iY2PY+qE6CdDYLQ6u6WPIODUzpRNPYlpk2eS9ZFy+fJQUPy2NYprCZcN5OZNCMzZyezbBRtFLSjGl4WXbSTDhL47TZmFnGQOUoHcdW6bhdcIx8bqlU0g6KjFKZQfnFechmJqSZDGhYRdLIbzabDfl8Xnex83g8DRF4yXd0hsiv5hJaXm/OipgNNwaicrlcRxtobPS+ZHRcvmsrOWnFk9LY4DplSRQbabAqQJZCmTM7hJw35TbpS4eba7xdGnRybVutSXPpl9z/2ew+XMdEM0dzIyOEz2CZsFJKd2Dc7LutgPL47QDXlaQlYXXcg9Q30ljcjiPB98tgqbkTZjN9s1ETCyt0kiflPQHoPTU04ml4byRTzGNp1mjBSgZuBZIvpaNAx1UG8xjAYpWNeTzbpWOt1tiBUI6r2frh+MxzMmf6WNYsK7I4bhnQoX5tBhmU53zNz5J6xEpXS4eHThZ1Vqs6py2Hx+fz4e6774bX68X09DS8Xq82bJVS6O3tRTweRzgcRigUQiAQ0FkeTjSbzcJut1u2lnS73QiHww3CltFa2bqSzpTNZtOb3tk20zAMzMzMoFarYXV1FQAQCoUwPDwMh8OBbDarO6T5fD5N4NnZWaRSKU1sZnWKxSJisZhulMD2nYVCAZOTk+2QT0Max4yKJZNJ3aWKtOjr69NOhMPhQDqdxuzsbMOLlUrYKvrKBUjmYCSPEQnJMNIQkP+SIb1eL8LhMOx2e4NRScVn3qvDGk8Aeh+B0+lET08PXC4XVldX9TtaXl7eEi03gmywYZUyNQtEvnsZkZCGoKSpeTOtNGKk4iKdWhFqXPTS8KQj2UpEbTsCnJCGLekkjTSplCgQCTl2GbE035+RItlsgDSSETjKFRlBNisICmLJc1YG5U47OgTHyvmY3/1G45Abrs1lg1yrhmHo6BbvTaXK+1MBmqPH/LuMrskSVzo+cqOzuVZa8oLcXC43/vJv5KOdyqyZ6cr1RmNJrnU5f6voKhW4jBLKOZmDAK2sbfOzSFvz2Jt9d7vZjWb3NUdwzbKL8k2Ws3G9WzlLkp/M2QQ68AzENeMFKXutZGmnsN1gzmYg/crlcoPDY2WMyeAYf5iRkZBZU6kDzHORa448K6sPNuPTcrnccP9mPEJsR99w7s2cf6t1uxXI7BWDTxIbZT2bgd+RNDNn2uU9+e43Ch6083wrWNkGUh/zGVY2ohyrLH3kdxhso441Z7J4LTt6mnlNrgezfpbBI5lZpk6TtoR5P6WUj63qm7Ycnr6+Pvzar/0avvGNb+Db3/42PB6Pzr64XC4cOXIEg4ODGB0dRSgUQk9PDwKBAKLRqPZw5+fnsbi4aOmBB4NB7N27V2+wo9eYzWa1N+nz+eDz+TA0NKSdH6UUFhcXkUgksLy8jFOnTumOZAAwMjKCT3/60/D7/bhy5Qrm5+fR19eHO++8E/l8Hs8++yzeeOMN7WTl83mcPXsWly9fxoEDB3DkyBEEg0EMDw/D6/Vibm4OMzMz+PKXv9wO+TSYJiRSqRQuX74Mu93e4KTdfffdCAQCmr7Xr19HIpFoEJ5WBp5UQFJp0Tj0er3weDwIBAKaQRmZ5UKQ5zJQCA8MDODYsWOw2+04d+6czkQFg0EAjcYw/52bm9PMyzOAHnzwQfT29mJ6ehq3bt1CrVbb1plGzcDSQwk5P/PGYrlJl9FG0lMKCZYCkP7SMZSCWrZHbkWYybQ0sx98X4Zh6M3+VuA7325knVlWwjCMhuwIfxgJ5/8p8ORBw0w5S6XicrkQCoX0IbTyOjmXZs0fzILd5XJp+ZLJZHQWUQrSt8vZkSiVSg2bSDmOZrwghbdVpIw08Hg8CAaDqNVqWFlZ0QEntlBmFoEBHcpPyRdyTx3fLde4LFWSc2CppeR1rmlzFlupea8AACAASURBVAu4fX6DUgpLS0udJa6ApCXXm2zta94kaxi3S9ak4SjXOLNhkidJf76nVtY26Qbc3kRtzgrLMUjDh2uiEyVYZlrZ7XZ4vV7YbDadoZdgVNc8j2aGBGUGZQBBncNNyel0umnkVnaN206Jz0aQwZydyPrI9Wt+b1Z8wutYhUGZ5/f7G67L5/NaP7MpiYyWyzVnDnJwL7Qcn9nAtloT1IEM+pozE9vVN7JskTAHJWWwYasy3OFwoLe3Fz6fD4lEAktLS+vWHO8v31mzZ8p1yvPPNgpomXWl1f1k8GkroD3D9cnxUT5LR4FOEJMKEnRM5Njcbre2sQnqdzkfNg2oVCq6GRhRrVZ1eTXHy/szIALctr+A2/pD6iDOj9tjJO+73W6tbxYXF5vSqi2Hx+FwIBQKAYBWtjSee3p6tIEio1/mVJOZoGYCMPIriUXlwrQwJ0wDkcqXL35lZUUvchKPzlcikUCpVEIsFkNvby9WV1dhGEbD9byP3OhIoRQIBODz+dad/dEuJLOwnpIRaumcsLTJKvLT7J7mbATHT0iHiIpe1pnKaJ4cpzy01O/3a9qT+cxlQzK6IcfA8gXW3G9XwbUinKz+ZgWZkjaPS24Cl8YrP7NSJBsJanN0yZxmNztSbwesaGZFK6u5ySiQ1XUbvSczHc0/G41XZvLMUfGNnIydhHR0WpkHv9PK38ylAM3oTfllnr9ZPsgfjtf8Ls33sFLsZuOllTlvB83GYFao5vVjNZeNeJy02OgeElbvwxzVJM9L+bzT2QfzGK14B7DutLbRfOX1ch5ybZobeTRz+rcyj3cioLEZWp2LdPLIh2YZyui15FPzv4Q5Om/mMfkd+bdm68ZKpstrtrO+W6GRzE5sFVbzsLqnpF0ra7HZmjDz5Nuhf+QzzPaHmW82em9WMt5MD/MPr2H5r9W9N3rX8l7NdJCcx0ZydzNeacvhyWQy+M53voOJiQntcSUSCTgcDiSTSTidTkxMTODKlSvweDwYHh5GLBbD5cuX10UIGJUEoDdyp1IpXLt2TWdZgHqjhGq1iuXlZf0MEqOvrw8PPfQQgsEg5ubmcObMGZ0ZkiiVSkilUlBKYXBwUGel3G633sgv4fF4cPjwYfT39yOdTuO73/0uHA4HgsEgXC4XstksVldX9T6ZrYKOm6wBZXlOqVTCtWvXtCOilMLy8vK6yBSdBzocLBOyYlA6oisrK3pDHZ0dls/NzMwgnU43RNIZiaLz4na7cc899+Dw4cMA6oyWy+Xw+uuvY2pqqmEjKvcP0KlLJBJ46aWX4PV6dUnbdoQBHVF5+B0hD7MlNlLq8hpumuN1DocD4XBYl+JlMhkdAZGKhPPcTJjLlqB8b2xfLR1eWTa0ETpV/iLLDCSttmuMyQh3Op1GJpNp2O/Av8nnyJbI/Eym1cnTDBYwmi+vlxvO3w7DiEJbtj4m5AZ2c7CkHaVImjDwwtJR0gOADgBZQWbeeL3MbjIQQVlrGMa6bINUUMwKyTJMZpp2ChvRihlYylPuT9isrAewVprUVbLpgBlyjZKfgdsySPIp5T7lMeknyzR2knbUr1xH5APq3Haj9rVa4+GXnCOjy6xaqFar8Pl8LctICflO+Ayup41K5STk+ng3gWXtnAcrWghm0MyVG2YjlrJbGrycr9xXxOApj+aQa4Lr3myTmB1j6qtOylS5Bvl/8pUs6W31mfxeIpHQNg0rCyifzOuevGsuK5djNOtH+TzSth2e3M5a5/etxkw7WY61XedRtommTiM/UI+wxK2V8n2ZZeV4ZHaXlTWyCxx/l7Yy5SdlFd9nRx2eXC6Hs2fPYn5+XjN9s038DocD4+PjGBgYwMLCwjohKsswaKjmcrmG1BdwO20IYF1pRC6XwwMPPACbrd6g4ObNm00jR7lcDl6vFwMDA3qfkLnOlnC5XNi7dy9GR0dx6tQpnDt3bkdS4LJunoYclWG5XMbc3FyDd2vVAYdpcL4Pc7qb4D24cY4ZLDJwJBKB2+3G4uLiOueU0V++Q5a3BQIBfd90Oo1z586tKwOhwVEoFPRBtJcuXeoYDSlk+D4ltrN5Wn6PgjAYDOq0bTqd1vOTmbdWu4FJI5/jpiC22eotu82bgjdDJ5SPlXNgFeFrF1S4tVpNl1jJyK/clM9xmI1sqYykwU2laO7/z/u83RFgwzD0upLgmGTGgJ+16rDK+bF8RZbvEps59FblDDTIZaceuWm/WZkO1wENeyqiTjUuaBeyFEY6ma3CyuExH8Ow0fXkU6BxPZn3a7Brk5QFHP9ORoWlzpUR1K3utZL7b2Twh9l7GiPtdp40Qxr41J1s7tGsmc/bHWnfKqThZkY4HNZlbmbHA2hsPb1RyTMNVuoWpZQOKMvrGIjjs2SGST57J7te8t2ZG/zw2a18n0Y5bVSPx9PQ7dZ8H64FVg9xfZqxUYZhM560wnZ5kg4JAwwy4My1Yn5/repzynOpqyV9pOMo9/01g9nh4TMqlUrD2Y9yrfK9NDvTEWjd1mvL4alUKkgkEggEAjh06JAucQKAiYkJzM3Nwe12IxKJ6E3xCwsLWF1dXefFsn11rVbD9PS0zjo0O/TK7/djbGwMgUAAU1NTmJ6e1os3Eong7rvv1g4UI1aTk5NYWFhArVbDjRs3MD8/j6mpKe3lV6tVZDIZpFIpAEAsFsOePXsQDod1Rzg6IEop+P3+hjKzqampdsjXFOzS5nA4MDU1hfn5+YZ2n/ScrRZQKBTC+Pg4arUabt26hVQq1aDEOE/C6/XiwIEDOitGp2poaAiRSAShUAj79+8HcNv7vnLlCmZmZlCpVHQGKJVKaeHBfQKZTEY/IxgMNrQSTyaT62p2SV8A6wy2VkHBazaM+beNPjOD+2U4nkqloqNrFGJcVDL6TSeTwjIYDOpx0bGkccpIHp9FI0q2vm5mkFqNXWaAOpXlYUaLZZuyA8tGdOSYDcNooJeMOAKNe0ioTJkJJBghk0aOPMzNHGmTTppZMZs/kwf1WhnC28lm8b3LOmOZJZRRU5aQttKMgt+VcmEjSGUny1WpvMxRW6s5yP/LrAUhy3B4HZ8pFZs5494OzEZru2tbbhg2R3Mpx2Uwyco4cLvdOtDBH+lUmZt8yMwJ/y75gMEjqRNl0w5JVysDtxOwMiBblZHmigLpxFkZkaytl/sHGI0mmPWxeraZBpKGMothfsbblc2RUfR2aMlOp4Zh6CAkIYM7SimdEfP5fA1HJ8iIvjS2+XdWKlDfyD1MVsEgGXTj8820lDTvJDbidSs5Lr9HmSMbFHDvh7mUj/uT6JSQh61KhMnT5nsA1uXTkidbXa/b0TeEbJwgA20MqPC9yz2NZtCRkXOUWxxkhtGKTuayS2nf8XNzUyY+l/dl4ESWbfO+HLfs5tauvmnL4SkWi7h58ybe//7349ixYwiFQhgZGYFhGHjqqacwNzeHUCiEu+66C06nE5cvX9ab0s0G3N69e/HRj34UhmHg5ZdfxuTkJBKJRNNUdywWwyc/+UmMjIzgmWeewezsLJxOJ+LxOIaGhjA2NqZfls1W34z59NNP48UXX0SxWMSLL76oPUnJjMz+AMDY2Bh+6qd+Si8GlqYwir9v3z7dhCEajeIb3/hGO+RrgGSYWCyGkydPIhQK4ZlnnsGtW7dgGIbe7ElH0CpCNTg4iMceewyVSgUvvPBCQxRRdhEhotEonnjiCQwPD+Mf/uEfcO3aNQwMDODo0aMYXWs2EQgENB1zuRy++MUv4pvf/CYKhQLeeustLQyZFl9dXdUReT7jzjvvbGh5e/PmTSQSiYaxsHECgKbtsTeDefOjFFyyg4j5MyuwzbphGFhcXEQul9NttVlmSIfc5/M1ZL646LhfjE5eJpPRe9xsNhuWlpaQTqfh8XgQDof1+2WkhOOTmU3CyphgxzO24u2UIpJljouLi/q8JAoVMx3lmF0ul15D5kYLVDYEjf9AIKBb0gO3HUPJz+ziSEVss9XbxS8uLup1Lcdj9Z75fG7GNQdY2o0kmlGr1fSByDLCDdQDASwr4dlYq6urm2aPlVLa0LEygjeKODIoZRiGPsiZn5kjbRy/PPBZPl8aU1x3ZoOXz3S73Q1O/lZAfrNyLjb6TNLGqh0w+YeNdSqVChYWFpDL5Royc7w/u43SOOI9WWYjgx+yREw69IwqA7eVOudIg9cM2S2vk0Ym3xFwu+kNZSTn3YynvF4v+vr6GmSklREogxvRaFQ/T74jaRwVCgXdkKdZJJo0oLNotZF+o7Ut79cp55G0ZHBQVlhIeliB5+/VajXMz883lHfb7XYdYC2VSshkMg0dTknjYrGI5eVlVCoVHbCUtEqlUlhdXW3osJrJZBq62kpwDrLZBEutzddaObjboaMsV7ayAZs9i9VCtAe9Xi+Wl5e1TSH38PB6OuEsq5fGuFyb0ug2y0urEsJ2Zd129Y0cCwOpgUAANptNZ/5dLpf+bHV1dcPmI7yOyOfzuiRVyiOOnZByk597PB74fL6GufFv0iH1eDz6/E0+y1zhwgqEarXaoIc41lb1TVsODxUIF7XL5dLGoDRiiI1S1zSaOWGfz9dQHic9TT7L6/XC5/MhHA4jHo8jEonoBUIvXDJpKBRCX18fkskkFhcXtUFmLldi9MPn82mjRDpeMo3HCMJmEdZW6cnIbygU0mVlVteYlRIhvXJmVmR9rTlqIZsh+P1+9PT06L0pUjBIZR0KhdDb26sZkl42HUvWAcu0pznqKwWYfEedKJcyK0gZVZBNJ/h3GT0l7zqdTp3Zo3HCroDkbSpb83vg/cwCi++G0Qo+3zxnsxFrntM7AY7Tqs0s/+U7Z803jXzyGKNNTFeTDtIhl4ahpIP5d6mwgNvyQxq77xbIKL35dytlAdxW2nJedKbtdjvC4bDer2PumGdVlivRzDCR78J8rTRaeX+rSLY0Wt8umJ9n/r+ZJ2WGhfLeZrPpDpiMgJv3zDVbk2YHT47D3EK+2btpJROwU7SV6410Ada/X0lH/vB4BrnnR2ZbrMYt58b7UI5KbNSUxyqD28wxsprvTkHS0lwaxjHKoJt0yqLRKCKRiHbe6BgzAyYPdTTzmxUPUt8AaCgZlkdbALffVzOZaSW3mu1b6yRaud9G+oY6nOcDstRdluiasxRmQ13qcsnH0tiX9uZGPPlOQc7RLKulQ019Q7nHTmfSPqGNJ50+mU2SkDwubR4JM33NYzPvw7GSs/JeZmzGQ205PEB9sVy+fBlLS0s4cOAAxsfHEQqF9ARXVlZw4cIF2Gw2XSpmhdnZWXz/+9/Xnvno6CgqlQqmp6f1HhF6h3ReJiYmkE6nsX//fhw7dgxAvX793LlzuHbtmj4Xhw7S/fffj1/91V/F66+/jr/4i79AJpNZFyVzuVzYv38/ent7EYlEcOvWLV06Q6ODqWB68Ddu3Gg4Q2YrMIzbrTgNo374aDgc1p6tjOyRkWQZFJHNZnH27Fm43W6MjY1h//79uHXrFi5fvqydSam0AODs2bOYmprC6OgoPvvZz6JWq2F5eRnz8/OYnp7GwsKCNrycTicOHTqEz372szh79iz+5m/+Rkf7KeS5+AOBgG5LfOnSpQZmZfSKWQkuCrnJvBNwOByIRCKw2+1Ip9PIZrP6mQC0I+tyuRAMBnWb7LGxsYZFSMd+aWkJs7Oz+jBCll0Ui0Vdsme32/X+s0KhgPn5ee2ARiIRVCoVLC4uasXBCB0dxWYtK4lmRhGjHkwRd9Lol1FlKSSZZeBmxWg0irGxMQSDQRw4cAB9fX1IpVKYnZ0FUG8173a7MT8/j5mZGVSrVS1ol5aWdAtJs4LhuyqVSlrxl0olfYhxNBrVpYOtgoKWAtwqYt4JhSWVjdX9WZ4qM9/xeByHDx9GMBjE+Pg44vE4lpeXMTMzA6UU+vv74fP5MDc3h4mJCd26nzLEvPmYYEtQucetUqlgdXUVNptNB3jagXSGOV9ms+RZHtut8Tfzn1yfcq5mYyMajWJ0dBSBQAB33nkn+vr6kM/nG2r57XY7kskkFhYWdESwUCggl8s1NIAwjPr+xNXVVR0IYcBHlsUoVS95lpFKZoC4PpvREbBuSdvpNU1wzyZlJHmB+zooI1l27vV6EY/H9Zl6DKpNTU0hk8lgcXERs7OzDaUyfEc80w6APp+PTYS4Bmq1WkPWkQaXNLaTyeSGJW+UG5QZMtBF+dHqRvJ2acnMyUa0ZKl/IBDAAw88gLGxMT1mrkdmcnhI9/LyMvL5fMMREmz5S+OThwTLvRvFYlFf53a7EY/HG5ydYrGoj5zYyGg009KMThr30tjd6L5S3xw8eBB9fX36vXJdAsCNGzd0aZvcxK+U0vSuVqvw+/0YGBhAuVzG8vKyLuczZy/C4TACgQByuRyWl5dRrVZ1Ix4G9q0cgM3o1AkaGoah140M9hKcL38H6vrmrrvuQjAYxP79+9HX14dSqaSrnUiDCxcu4PXXX9e85HA4GuSh1Z5yedwJtzmYIWUF93bLihxCZv1ox9J5Z/UEm9S0ss++bYfHMAwsLCxgYWEBbrdbRyA5yEKh0FJ5UjqdxpUrV+D3+3Hw4EHEYjGt3JlVYPaIxn4ikUAul8PDDz+Mhx56CIlEAi+++CLm5+dx+vRpnD59Wr/oYDCIhx9+GI8++qguVbDa1GS329Hf34+RkRFUKhUsLy/DZrMhEolohSZPQy6Xy0gkEpiamto2s8ooCsuA6ADK6AFw26gwt8OmkxgMBnH8+HH09/ejUCjg2rVr66IgdNqmp6exvLyMw4cP48knn8T8/Dy+9a1vYXZ2FqdPn8a5c+e00A6FQjhx4gSefPJJAMBXv/rVpht3GSFgmZGVAJARJ46nk4LTbrfrfUNy8TJTIXu5+/1+RCIR3HPPPbjvvvuQy+WQTqcbMliXL19GJpPR/MN7cC5erxdOp7PhJHYaTG63G36/X3f1Yxt3OjwsE9hos51U5s0M2p2op6bBJ/czMIItDTWeidXT04P7778fd9xxByYnJ3H+/HkAwJ49exAMBnH16lUtnOjwFgoFfS6C3LdA3ud6Y8kQ94rxuSyHbBebbW7cLj82e2cyimUu3Q0EAhgdHUU8Hsf73vc+7Nu3D9PT07h48SIAYGhoCMFgEFeuXNGOdSaTQalU0g00rNYbnyXnzM8YGLIafyvzo2w2K6BOGurmObWS9fB6vZon3/e+92FsbAyZTEY3vaF8uH79OvL5vO6q5PF4dEmf5Ekro4/BIBm0ohPE+ZtLLK1gjipvNPdOgSU9m8lIv9+PoaEhhEIh7Nu3Dz09PXpPY7lchtvt1ntGzWfssMSG8pDrPhwO63JINiWh4RmNRnWJrlkGsMtWM0jnwZz56dTxB1aQGRvKJtLSZrNpWrJcKBaL4d5778V9992HfD7fcNi5DLBRX8g5FwoF7QzRTjDvKZM6qFqtrpOTNEQ3c/zorL6daCVL4vP5sHfvXsRiMZw4cQLj4+PI5/NIp9MNDZlKpRLm5uZ0syTKP9KIzhztzFwup0vuGagAbmdL6OhTLpCfZTdGic30ttW8twoGkmmTmEF5LxEMBjE6Oore3l488MADGB8f18ELaf+USiVcvXoVxWJRBzt53p3VuBlcJk+3sjebssIMczaTc5PyQQZFOt60gGBkXCmFV155Rf9+4sQJZLNZLC0taW+xWCyu2wxOQZjJZFAsFjExMYHFxUUsLCzoCVAQU+jRGbDZbDh//rze77O4uIhSqYSjR4/i7rvv1mP0er24++674fF4MD4+jp//+Z/H7OwsXn31VUxMTOjrKpUKZmdntcJjN5SJiQnUajUsLi5qQ7W3t1fv4RkbG8Pp06e3Qj4A0NkjwzCQSqVw6tQpRCIRlEol3HHHHcjn87oNtayzpjPEz9hOtlarN2Zg7aqMcJlTs4FAQDd/+Pa3v41cLodUKgXDMHDPPffgrrvu0gvd5/PpaNTQ0BA+9rGPYWFhAefPn8f09DSAxsVt3kshN4hTkHC/RiQSQSwWAwB85zvf2RIdSRPCZrPpunIKIbmPgkqvt7cXDz30EGKxmD5Q1u12IxQK6ajk6uoqwuEw7rvvPi3karWabtrAxc2MBxc3hQ8FYrlc1hERWdpFZyKbzaJYLGJ2dhZXrlxpiBaxrI7X7VTnq2Z0ZPTFTEe+43A4jLvvvhvxeBzDw8P6EFBGuhOJBObn5+Hz+XDixAldClOpVNDT04OxsbEGo4EHCzMKzFpfeaiazWZDf38/otEo0uk0JicntVFaq9UbpZCOhNwgzL0nErLEh7TfqoFkjnLzfswQWJUDRKNR3HPPPejr68Pw8DB6enoaDD46h+x+SX5kBoLrV46B38/n8zqzRsOPvMr2/AQNfO4ruHHjho7Es+xGlnaw/Ebyqyx72C7k5lUA6+QMxyERiURw9OhRxONx7Nu3D/F4HH6/H8FgEMViEXNzc0gkEjAMA8PDw1o5G0Z9TxWzZZSbNC5pTMqIKqOLzKazHDqTyejoOyP31DPSkJW8shE2i3xvBsphyh1uZpeGoGwBDNQb4hw6dAixWAz9/f2IRCKaLoVCAel0GoZhYP/+/RgYGNBGMjMaNHzo3PNwQh5nIR0kBtdk8JT6rVKpIJlMIpvNIp1O64z7ysqKzgBzT2Uul2swnqQzQV6VdG8XUk6SL630jey8CdQPbX/kkUcQj8dxxx13oKenB9lsVgfS5CGkDAbxCAw61+VyWbfz9/v98Pv9Wi5UKhXE43H09PSgUCggmUyiVqtpOSmzGxMTE1haWkIqldIZztXV1QajWAa3mkXymWHaKiRP8pmElC+S7/1+P0ZGRhCPxxEKheBw1I8L8fv9KJfLWFpaQi6XQyQSwfDwcIPOlZloOolsXFIoFDA2NoZSqaRtTcpPpZR+RjabxYEDB/TaZvYkmUzqdU46StvLvHY7pW8ok2TFDce8ka0QDodx5MiRBn3DbR0y49jb24uDBw/CMAyEw2E4nU7kcjm9b5uONffh0NYnD9O5tmpcRtCmXVhYwPXr17X9Q33D9SZ1gXTwgdsNEpRSTRufAVtweGw2G3p7e7F3715ks1n87d/+LWq1Gh577DF84hOfwNzcHE6dOqUFPD3D3t5eAEAikdCLi4zBEiAZFVteXm7o3BYMBhEKhaCUwgsvvIDJyUldstDT04Of+7mfw5NPPtmweLjR98SJEzhy5AgWFhbwuc99rsHhKZVKuHLlCq5du4bh4WEcOHAApVIJFy9eRCKRaNjvMjw8jIGBAUQiEUSjUdy8ebNd8umx0RCuVCqYn5/H17/+dbjdbhw4cAD3338/pqenkUgkGspWaGA7HA5txDBlu7q6qksIJR3NHj83PobDYVy4cAHPPfccfD4fhoeHEQwG8cQTT+CBBx7Q71oppbNKhw4dwm/91m8hmUziT/7kT9aV9FFpcqExSyS7ptjtdkSjUYRCIRw4cAAHDx6EzWbbssPDshwp0JPJZIOglPXm/GxsbAyf+cxn0Nvbq6Nx3B9Gpz2VSmHv3r145JFH9MY/p9OJdDqN5eXlhoi2rCVmaQZTv7IUjAJJ7nOhMn/llVcwPT3dYAiwnIRKtJkQ4/y3qsg5f2lQtkLHgYEBPPbYY+jv79f10/v27YPT6UQqlcJTTz2Fa9eu4d5778XDDz+MarWKGzduIJPJIBgM6lOcqRj6+vrQ19enx2UYBm7cuIGpqSl4PB5Eo1E4nU709vYiHA5jaWkJly5dasiYvPLKK5iammpweDweD+LxuKa/nBeVO4MQZmO0XVBRmo0EWV5hxsDAAD784Q9jYGBAr/FYLIahoSGk02m89NJLuHXrFvr7+3Hfffdp55zri6UMpOXCwoLOsvKdhkIh+P1+FItFHRHldySYtTx16hSeeuoppFIprcjleTGygw+VEbPh5pbiWwHfi5wf6UsaA+vf09DQEE6ePIn+/n74/X5tvNRqNX3W27Vr19DX14e77roLLpdL72NkaZDc/xCPxzXvUMHT4apUKpr3+Fm1WtWOzvz8vH7myy+/rLtZkv9acWK4trfq8MgsB98TA4o0WOm4kb4A0N/fj0cffbRhbefzeb3pnQ0wWCGhlNJBmYGBAQwMDGjnF6iXX/PvDNLJ7CDXBgMXsoSQjuLly5fxve99D+l0Gjdv3tQGaiwWa+BJmS2QBij5aKulbVuVk2NjY/jFX/zFBloy0MigRqVSQTQa1bx25513olar6SCQ5IF4PI5YLIaVlRVcv34duVwOsVgMkUhE2wNAfS3EYjHNz+VyGefPn8fMzAwuX76Ml19+WR/pYXZ4GIRilkSC3fqaHUvSCh3NZwvJZ5O2+Xy+wbBlRQa3IDBIzWAxr9uzZ49evwMDA7rclDZhX18fXC4XFhcXddMb8mQkEtFlm6zC4BjIn6VSCbdu3cLS0hISiQRu3ryJlZUV3LhxQ2fPpTMnAxsycC2z4VvhSQaozLTj35qhr68Pjz76KPbs2YNIJKKDgQxQXL9+HclkUncPdrlcGBkZ0WdRut1uFAoFTE9P6yw5K15IWzrFmUwGk5OT6/iLzouVvkmn0ygUCg175un4SPlLsJoGQOccHi52RrYYZWGduOw2JZlUTk4Kbw6Y//r9fsRiMTidTk3YxcVFXWJABpaRZmYJQqGQ9jDlmQYkBjtADQ0NYXR0VKdBqaAobLnIvV4v/H6/Hiefz3bbXIidABUpFx0jB1wc5vIRWWNqjiBzvuwKRkHHyCUzDzTAqfDC4TB6enoQjUYRDocboqoE98fYbDYMDAxgaGhIR4eo5LlBnYYs97jICBL5g6ln83PagdlokP+3KvGRfMHImuSPTCajacUx09lkUwvpXDCiycUtHR4KCpYi0iEjjWTkwufzoaenB4FAQAta8oA5ii2zQ83qsLcD0kjW2Ur6SloyElMoFBCJROByufT6yGazDZFkzodRoGAwiFgs1uDw8MwJlmOybr1UKsHtdiMajWoDM0YDaQAAIABJREFUlVE9NtQgYrGYLp2RdOR85Bz4XHPd9k6h2buqVOpnmnEfHCNpmUwGmUwG+Xx+XXaAUV5GKa1kAucp+Zc8LxWHzADznpSrlEvykDnzM5iBNkdtd4JuzRwFuS7z+TwKhQL8fj/cbremZTqd1ms7EAigWCzq9cfac5nZsdvt6Onp0c1MzHSjw8PfJa/xd5fLhUwmg1gspqPJ22nVvVVsJCv5fys65vN5RKNReDweZLNZJJNJHXCT5SXM3nOPHQ1tmcVxOOpnhfBoCDpi1MEyI0MHhk4LHYJoNKq/y3FbZQPM82rVwWyFjpLHW5GTwO3OkzTeqtUqVlZWGuQ8DzRnVoEZfnO3q0gkojtWxuNxFAoF3WGVfEp5GgwGtW4ql8uIxWIolUpYWlrSG/ytSqE6Ra+N6ChhNtbNMox/l3YDs9OsRGA1APUPz97h/mjKA2YrGHhn+Z9hGNrhYRBAOqQcS7lc1pm9Wq2mM8ZWdOR3zDyx03JSQu4rZVZoZWVFBx25P5md3UhH7ms0DEM3uaLDQ37O5/Pa/mEjM+okNvrK5/MNh91Lu5b2F/UNHXa5ruX3JA3lvKmDNkJbDg/LxJaXl3Hp0iXdntMwDJw5c0ZHCZLJZEP9nlVJgvllKKVw7NgxPPnkkwiHw9i7dy98Ph++/vWv4ytf+Qr8fr+OaiildF3xL/zCL+jWjmfPnkUkEsH4+Lhl17hAIIBf/uVfxhNPPIHTp0/j6aefRiqVwvLyMnK5HHp7e3HkyBE4nU7ceeedKJVKeOutt3Dq1CndxpHZn2vXrq07CLUdSOFMJiyXy7r5AheXrAn3er0629KsNlIphUOHDuGhhx7SDqTL5cJ3v/td/P3f/z0cDofucsd7jIyM4Gd/9mcxODgIl8ulGZgRGL4zvkO/34+f+ZmfwYMPPogLFy7g+eefRyqVwszMDLLZrM6UyUM5r127hnPnzqFSqeg65Fwut+UsGWEYRoNHL8vMuCDlXEijxcVFPPvss+jr68NP//RPY3x8HGfPnsVzzz2HTCaD+fl5ZLNZrKysIJ/PIxKJ4Pjx47p8ghE33pPOk3wWszN8Jq+jsmaZZyQS0evm/vvvx+LiIi5duoTFxUXk83nMzc01RCrpLFSr1Yba+e0oJ+5d4JlDm4HXzc/P4+mnn8bAwAA++clPYs+ePXjrrbfw/PPPY2VlBUtLS7DZbJicnMTzzz8Pj8eDvr4+zZvDw8MN3YXy+TwWFxd1e2+n04k9e/YgFotppU3HMZfLwel0Ynx8vOH95/N5XL9+HQsLCzh79izm5ub0fc0RMRkU2KgDzU7jypUr+LM/+zPs2bMHn/rUp3D8+HFcvXoVX/va13TjDaWU3n8Xi8UwMjKC/v7+dR2YqJwGBwcB3Fa2VNo2mw179+4FAN0mnXzNzeNerxerq6s4ceIEFhcX8eqrr+oyBrneGICi49CsO89WIMdsvqdVsImO4uzsLL72ta9hYGAAn/jEJ9Df34+LFy/i2WefRTKZxMTEhO7cOTU1hb6+Puzbt09nJMyZbSpgZqzNJcUs3SLPyLU9MDCAbDaLwcFBnZF87rnndPDJHAFuRoft8CN5ns/jXiMzTeV+Wbajf+aZZ9Df34+Pf/zj6Ovrw7Vr1/DlL38ZlUoF+/fvR09PD6ampnDlyhWEQiF84AMfwMDAgM4+SiecRruE2YgxDEMH/ayy4CMjI7j//vt1wxO2xuZh6M0aGwCtH+67EVg2J8scrUAeotE3NzeHv/u7v0NfXx8+/vGP4+jRo5iZmcEzzzyDYrGoHcqbN2/iwoUL6Ovrw6/8yq/grrvuapBNXIN0El0uF0ZHRxscbpaLcwyU6zRCyYvFYhH9/f2w2Wy4deuWHjuNx0Kh0LRqQJYQb5WOdFoofynbqbdl9oN0XFlZwWuvvYa+vj589KMfxZ49ezAxMYGXXnpJ74kqFou4du0a3nzzTV1CyBI4BsIKhQKy2SyUUrrkj81MGBiSQbJ0Oq0zmtzb3dPTg1wup7c/JBIJXT1k5jWzkc9/ZVnpToGl4gC0I3PlyhX86Z/+KQYHB/GZz3wG999/P65fv47vf//7ehuK3W7H2bNn8fLLL6O/vx/33nsvhoeHtcPJ8mqgsYsdg+h+v1/vWWYggw6ntJ0oc1OpFI4fP475+XkdSGfZHGUWA/5mB4hO66a0aIdwLpcLe/bsQTKZ1JuNidnZWd2ZyQpmz8z8f5vNhj179uD9738/4vE49u/fj2AwiEuXLunFyjpsKu3R0VEcP34cQ0NDOHfuHK5cuYJqtYqRkZGm4z9+/DiOHz8Op9OJH/zgB6jVajqS7/P50NfXB6/Xi4GBAb2Hh0xJY2hmZgZnzpzZVsmGVXStWq0ikUjoumRGeLh4uOjlC+d3JeLxOO655x5EIhEMDg7C6/ViYmJCCxbZ3rtQKGDPnj04evQohoeHsbCwgKWlJZ0ps7q/0+nEwYMHcfDgQSil8KMf/UgrmlKpBK/Xi5GRkYZTcxcXF7XwZNQkm83qDj7boaOsI5aNHfg5lbik2erqKi5duqT3iYRCIeRyObzxxhtIp9M6U0m+YySI74GbaymkGbWlQUHjSKnbneykAOV9qRRLpZKup3U6nVoBWW3oo0FFBdiJzaWko8w8NQPn6HQ6sbq6igsXLiCZTOLkyZO6lO3MmTPIZrP6LImVlRX9f2Zp5AG1sqsRy4aq1arO9sqSJiogrhNGkvl+9+zZg9HRUbjdbly7dg3A+pOYpbEnM6jNFPxOI5FI4Ec/+hEGBwfxoQ99CDabDYlEAqdPn0Y+n8fIyAgikYjeuGyOqDOySF7z+XwN0UZmL2n8MItL/mJkzul0IhQK6dKEvXv36ow30Ng5jNkcma1n9LtTaPVdmHnyrbfeQiKRwE/8xE9onnzjjTeQTCZ1qXQul8PKyoqODJLPZJt/m82mjW0GM7i+mfmV8+b3eGSC2+3W+zDy+TzC4TBefvllPe6N6vw7CamrKIus1gCzdHJtLy8v40Mf+hAcDgeWl5dx+vRpVKtV9Pb2oqenRwe7enp68MEPflBXW5h1lFznkoZAY0tljsXpdOoqCxrY4XAYQ0NDDU5lO0bjdmlMOSkNvGYw0/LcuXNIJBKalul0GhcvXkShUMDg4KBuSvKP//iPGBkZ0dkbgvOko8DKAgbfuL5lxzs6j9K4DAaDmkf9fr8uuzbPcyOaSjmwVbDhlQwUANAZFUlHru1CoYCpqSntEPF8rGvXrum9mbVaDZOTk7h06ZLeO+L3+/V5WtxTQqealUFc/+Z9jbJiye126z3r3I9WLBbR09OjnQBJQ45fygdzdmKn9Y20fxjs4zqenZ3FyZMnAdR10FtvvaUdYb/fj8nJSZw7d05XWdFOYnaXQTL+sIlOpXL70HagXk5drVZ1WbV0eIje3l4MDg5q55O0YZaH9qgM3Mgsa8cdHqfTib179+r2zywxkfsVotEo9u/fD5vNhhs3bmB+fh49PT04duyY3lgIAMlkUntyzJ4kEgl885vfxODgoE4rjoyM4PHHH0cwGMSDDz6IWCyGbDar0+y5XA6Tk5N4/fXX8corr8Dv9+NHP/pRA8OywwaZ2el04vXXX8fc3BxWVla0R7+ysoIXX3yxoaNLJpPBPffcA7/fj1AoZFlzuhVIpqcQpXEM1BtDHD58GE6nEzdu3MDCwoKuOaciplc8NzenMwT5fB4LCwv43ve+h/7+fnzoQx/SXYsefPBBBINBHDlyBD09PRgcHMTKygrC4bAuHTx//jyuXr3asEg4XqbX5V4iOg3sUMONltevX29okUgHmU0TWB6xndbeVqCgloYrI7HSqFhdXdXdBGkAcUMsDwt1uVy6AcfQ0BAeeeQReDwevPnmmzhz5ow2eLjwzRFMlgFxnSilsLCwgFQqhfHxcTz22GO6BAG43faZUeRmYCkpjV5GmOX+k+3Qb7OIMg1cpvWXlpZgt9uxsrKi26lOTExgdXVVl0ex5ru3txfRaBR79+7FxMQEXnjhBa24mZ3J5XJ6cyr5JJfL6cYhlC1zc3MYHx/H448/rg1/RjTpuDMrxigpcDvLRn6Q0UallK4FJk9vB2bHl4qT74lygG1RXS4Xkskk0um0Diwxw0Mnj/saGYF944038Prrr2uFzLlyDZM2y8vLSKVSes+DzWbD3NwclpeXsW/fPjz00ENagXFssjRTZptpzHHfE9caA0MsoQOg94t0AqSXNBK4VlhWy30F5CeOYXZ2FqlUSr9/lr4Eg0G9js6ePYvTp0/r/SU0LKWCp6JVSjWUdXPtjoyM4AMf+IAuH+SejpWVFV3CBNyOpPP3dua8HVBGSodDQu65YYaW5amMjJdKJb1fYWFhAbOzsxgaGtLO85tvvok33nijgY7c2Cz5n7qXJfKVSkXzJGUk918opfTxCQsLCw2ZRtJIbrS3MtibBQnbBfWJzWbTh32ybEc+i5lTAJqWLFFl+36WULvdbiSTSV1eSbl55swZnDp1SgcnaHjSpmFgkeWaNOIB6INHR0dH8fDDD+syTpYKMxDVbpahUzwpv29umkHI0qbV1VVMTk42lFKlUimcP38emUxGXzc3N6fXNDuxXbp0CW+99ZZuOFCr1RAKhRoOa1VK6RbUbBzFyp5yuazXNg9i5niXl5d1ZZMZMqBBviuXy+uCJp1Y32Z9Q7lFvpdnvRWLxYa9lplMBleuXNH60+v1Yn5+Hm63W3e2BIBz587hhz/8IQDovY/kx0Kh0NDoy+126wZmDMbVajWMj4/j0UcfbeggSH3FYDvpC0BXdbAJBYMN1Oky6LeRvmnL4fF4PNi/fz8uX76sPdx9+/bpSOrq6ir6+/tx8uRJeDwefP3rX8f8/Dz6+/vx+OOPIx6P63T39evXcfr0aaysrGByclIbm1/60pdwxx134IMf/CDuuOMOHDp0CJ/+9KcRCARw/PhxRKPRhnrXmzdvYmpqCt/5znfw9NNPA1i/UT8ajWJkZETvk/D7/ZiYmMDk5CRqtRr27t2LSCSCpaUlPPvssw1G49GjR/GBD3ygwRDtlMNDsCTEPOYTJ07A4/EgmUzi5s2bukV0PB7H0NAQotEorl69itdeew2pVAoXL17E4uKiPodn3759OHLkCAYHBzE2Noaf/MmfhM/nw+HDhxEKhbTxtbq6qs84+va3v42XX37ZcvHxIFdGiH0+H2ZnZ7G4uKiNL4/Hg0wmgzfffBPAbcVChuf+C3ZMYuSgU2DqlL/zXwpTGp08MLVcLmtHMZFI6DOW2I51dnYWly5d0h3z/H4/Tp06hS984QsNXdnGxsYwOjoKANrIWVhYQCKRQDQaxeHDh+FyufDGG2/g6tWr+MhHPoLDhw83RAmpqGTq1sr5oLHLbB3bxDIrtV20UkLDunN2DqLBTmF56dIlpNNprRgYMFCq3pjgwIED+Na3voU/+IM/aCh9ZSenSCSCO++8E16vVzct6Ovrw7Fjx+B0OvHqq6/i4sWLOHnyJI4ePdpQwsrObSwJpICnsWU+g4KKQSmlOxjScdoupJFMpSkdH8oTdg+r1erd0ZaWlrQhSaPE4/HorMTq6ipyuRxsNht+8IMf4POf/zwMw0A8HtfBCJYyMCI+NzeHxcVF+P1+9Pf3w263Y3FxEalUCo899hgeeeQRPXe+D0aoaYSRz5i9YISWRqxsh8tIXqccHjpgBB0vOqo0ZGhMstsQs1u3bt3C8vKypg/BGnafz7dubdMA4n4Jmdll5J5VAJSJDz30EA4dOqQjqgzqJZNJff6MnMNmoDLvVJtgyshmBqvMJDCDzBbobFrA4Njk5KR2QujMeb1evPzyy/j85z+vDR8GS/fu3av3rtRqNQwMDKC3t1e3Bc7n87hy5QqmpqZw8uRJ3HvvvfB6vXpdTkxM4NatW5ibm9N8JTO0fLfsECUho8rbDQyRRj6fD5FIBA6HQwdYZBSfwdZsNou5uTmUSiUtJxkYSiaTmodpnEejUW1kSloyY97f36/XsHRuMpmMNiprtZp2Hh955BEMDg6ir69Pyx7yI8ui20GneFJWPXA9W70bOjLpdFo3vmI2a2lpCa+++ioSiUTD+Ohk9/T0IB6P46//+q/xhS98AeVyGYFAAA6HA8PDwxgaGtIB90qlgv7+fvT29uqMRz6f13r20UcfxfHjx3Xwm+Oen5/H/Px8060GUp/KbITMbHbijCipb7innjKT/EjeNDs8iUQCZ86cQSqV0nvoDcPQ+9l5n1deeQV/+Id/iFqthng8Dq/Xi8HBQQwODuoERKFQ0AEx2YSEAd+PfexjOHr06DqHh9UzDLBRF8nKIDr4AHT5LeXxZvqmLYenUqmfU8OFzk5jABpeoNvt1kYbv7e6uqpT0NwMSs+XkYqVlRVdinTr1i1cunQJ09PTWpBOTU0hnU7r8aysrGBiYgKpVApLS0s64kNjMRqNasZmmz1G7l0uF4aGhlCtVnXkkkSnA8LP2NmDKTVutpYLrF2Y05pmkI7S0eL+F+5rkPsZGK0AoA/czGazmJmZQSQSwdzcnK5vpRHFRZjJZHDz5k19VgWNBBpkPT092lhlKphpX4/Hg4GBAeTzeUxPT+uNzXJfEqN80WhUK4hAIIBMJtPQTrRTkNF7QjoV5lQo581IOluFsoyNgoGRHv6wblQppXkQuO3wMKKulNIthXnoZblc1tF21suygxNrVzcClZpUbp2iHdcyyynNtdo0hOmsUYCvrKwgkUjo2miuJRpPLPuT+x/kplG+D/6+tLQEt9uN5eVlpNNpXQvPfWa8nm0ySUc+i7woaSadDP4w4i0jiZ0sy5J04/Ok/CNv8m88Y4dBAtLK3IqZtKLzzuiXjOLl83mtDBKJhN4/x3dIfpQymtkh7mHjvc2lf9Ixkv+SzjtRqmFV/mUuzeJ1dMBYkiZpJ8fG3+k0MVPJOcpyIElb0o9nd7FUmHt+PB6PXsfFYlFHgdttWLDdPTxWMMtIq0ykdCa5H4/7GBghZpZLRvy5fzebzWr7oFKpIJ1Ow+Px6Eg91wF5eHl5WctargVWAdDRpCyhXpE0Am6fj0SHzky3TtNxs/vJzJXMUlBOkpfM92MGXdKSJWCUtTQoaZdQd8gsMsuw+bvUz1KnmdeVLDuUY5MNFjpJy83uKf/ONcxz8/L5fIO+IciTvF7uC6GcJF8Xi0UdJGFpHfU3nRjqFnYopCwslUq6CsFKb8uyVyt+3IlSVr5PWVZqpolcd7QPKSPNJYWyZFkerEwZt7y8DLvdrluiMyDLdcz7somQ3CJCMOjMTJksvbUqCTTzQyv6pi2HJ5FI4Ctf+QrcbjcOHTqk29IxqmYmKjEzM4NvfetbiMfj+PCHPwyg3or61q1bMIx6H/9oNIq+vj69Ge+LX/wi/vzP/1wra0bpJYG4gbZcLmN2dlaXdPT09CAYDOLjH/84PvjBD+LNN9/EV7/6VaysrOgWhSMjI/jkJz+JfD6P5557DpcvX4bL5fr/qXvT57bu63z8AUmQ2FeSABdQXESK2qw1VixVtmpbsZ0mkzrtdDLNdNr3fd9pZ/oXdKZv+q5vks4k03amqd06aeLEtWzLtixZCymJEvcVBEECIMAFJMEN+L7g7zk8uLqguMnN78x4LFEE7r3nfj7nc5bnPAfHjh1DLpfDxMQEFhcXJUPALBMNjt/vx69+9au9qK9IP5qus9TvcFMyu5pIJPD+++8jEAjg3XffRWVlJaamptDf3w8AOHnyJGpqavD48WN8/fXXWFlZwb/9278JEwuxvE6nU2B7XMDsHeIcAy4iu92O69ev49q1a+jp6cH777+PTCaDcDgs84jeeecdLCws4Oc//zmmp6elvMmepFwuh9bWVpw4cUL6pGw2G3w+nwQ8B5lppEXDJYyGxGKxyDXX17eHWLIaNTw8LLOWyJZDaMTy8jKmp6cxMTGB9fV11NXVSbadVSJOFaZeeTAzU1pZWYlwOIxLly7B7/fj7t27cLvdqKurE5pwZqrS6XTRJuf3asnn82LsdQB0EKEh4j4iZIDQQxp5MgLR2ANbpW6LxYKRkRHJ/NDp4YHgcrmQTCYF3lFXV1dEV7uxsSEZZCZACBUhXInU6mfOnEEwGMTIyAjm5uZQU1MDj8cjcNlUKiWOKw98wkx0wE6DTYfgsDLpwDZcle+O9kzPBNKzROx2O+LxOHp6ehCLxZ6xEUwWcVYR4Zh8dzpbzAMvHo+LY8qMXzweR2VlJTo6OtDR0QGbzYbu7m7JpBO6ef/+fWQyGWQyGQAoyigbgx6uVwDPDDs9LF2WgoDp6g+dyPLycvT19cHj8WBgYECceupKBzPG79KQXj1CQeuWDj51SiIdm82G4eFhJJNJQRTMzMzgs88+ExpbDRUGtm2G2X7XCaTD0qPRRpKqV/cs0UZ7vV4MDAwAAEZGRlBTUwOHw4GFhQWBYLFSw8COyUX2hLGPigQsXBsTExPS1ExYaUNDAzo6OlBXV4eRkRGk02nU1tbC4/EIbEsHU9pJJ/wNwDOUxi/CuWTChUkso55JegNs96g8ffoUFosFY2NjqK6uLspyM1jWkNZcLifJHFZ4qEtg26HWvUwMJuvq6tDS0oL6+noh3mBCjnaYNOn0CZigJO0zdcsqPpPBh63P5zmsTFYxKTM8PIxbt24hHo+jtrYWDodD7A4DY76DdDpd5ISzeT6dTiMWi0mgXigUBJmgZ03V1dXJ/hgeHhbiGJ5nIyMjkjTVNpFVR1bDeE/GvX2YOiRcDtiecWNMShGOns/ncePGDSQSCfT09KCqqkoq3qwCEY5LZIned0wsTExMYGxsTIIoJkyMSZVAIIBwOIzq6mphSubvDQ8P43e/+52gDqgr2kXC4jWJhya12Q3yak8Bz+rqKgYGBtDa2orW1lYpzZaCJVHRKysriEajUtYnlGlhYQEVFRXweDxoaGjA3NwcAoEAMpkMnjx5IouqtrZWIB+lOLapFMIOXC4Xjh07hitXrkiWg86hzWZDKBTC2bNnsbS0hFu3biGXy4mBz+VyQsDADApxjFarFcFgULDK+xVj5G0mXAh8plwuJwcAN3A2m0U6nRYnsLm5GTMzM0JrOzg4+Iwh5rWZcaJDv7m5KUxw3JQWiwWRSATnz58Xp5QwIfZUHD9+HHNzc3A6nUXVAV6DMIf6+nqBFVZWVgpD3mFngksZEMJwiM/lukgmkxgbG8PCwoL0b+i+JDqL2WxWIAPEZTO7yXdhlqmizqxWK5qamlBXVwe73Y5EIoGFhYWijBIzLbo0bnQqtRwUmmEU7VBqaJQWOo5slqUzmEqlMD4+LpUrlqFplLjO2NvEcjkdMELymBE17nUaaTbz8pAj4xUrsaQk5Zrm87C3hA5xVVWVHJIa6nKYOtWHGw8RVhF5gNN2kZSEfVGE/Wihsa+oqJAKmXZyuB6B7fVSalYG2QTJhsfqLucypFIpzMzMYH5+XvaKrlLxmmbV6sPWI2Un50BXYrhm0+m0QNn4Ozq4oNDR04cznQUzR8UoRA2Q7pbJEqfTCYfDgeXlZUxNTck0d15b65Jidi686MqEZkHietEN3WS3m5ubk54bnv82m02CZPZWsHeAtqKyslIGND5Pj21tbairq4PT6ZS+DCJKCNPRM1co+qw8TLbAnYROX1lZWdF6595j0kv32szOzmJiYkJ6RbWjRvtIR5MZcd2TRxIYOuOldMlr1tbWyrgDJj6ZhOLfaYv4THTU9RgGVt70s39TwjOVe7usbKt/mQggniNEvGi7SEgp+9YASJ8Ig3atR55TZF7lGtbz9ehH0s+an5+XobBAMRkX75n+lNmzHaZwHfLa+prUkYb5R6NRlJeXY3p6Wvxd3hN/j2uGFT7j/es4oNR6LC8vRygUkgIC3xPvj60bTIbqRK6Gq+qkk0ak7Eb2PHi0UChgbm4OY2NjsFqt6OzsBABEo1HMzMxgYWEBT58+hcvlQm1tLa5duyafZVaYzvvExIQwvwQCAaRSKYyOjmJjYwONjY1obm6WQVzAdt8ADxH9cvr7+zE6OioZZzIZsZmcWNrTp0/j5Zdfls+T9o5ZDjpbdMgmJibwySefSA8ADwRmmfYjNIR8UWRIYkmQAeHt27clE33hwgUJGMk2wtI94VLMhDGQ2NzcRDAYlL4Q9lMw40YIBrMCGxsbGBkZweTkpJQtmSkFtg/AfD6PlpYWnDlzRmamANvDn/gchUJBovJsNitVNGZopqenEYvF9qXDUsJDwbjJWVLlf8z4E1fKpnsaLA0V4HcwGzk6OirUyadPn4bL5UIwGITf70cymcStW7fEGdBOO+nOr1y5IusRgOhhdHRUsOca/8oMBh0w/kwbHm0A9iN0uFnhYaWFGW6tB30N9ueUl5cjFosJtpqHC5MEGhbY3d2NxcVF9PT0IJlMwm6349KlS8Ia5HQ6EY/H8cknnyCVShU5z8w+dnZ24vLly0KAUFZWhsnJSfT09KC3t1eyTBobznfPPa7XwIuiBtX9EjTUei4Tgw4GvaTCn5qakioMP6ffTTqdlgbceDwulegzZ85Ihdvj8SAWi0nWjI2gPMCdTifOnj2L1157DTabTShbo9EopqamMDExgUQigaWlJdGTZqciTEdDAzXci3bjMHqhgGf3thHOYIRQrKysoKenB6lUClNTU/Ie9PDUfH6Ljv3zzz/HzMwMenp6sLm5xSZ06dIlycC73W7E43HcuHFDDmQ6FLStp06dwre+9S14PB5hGxofH0d3dzeePHkiGH2dTDJWWswchoPu7efpEdiuPlCPPFfp+A0NDWFmZqbIAfd4PEJPz8Tb4OCgrKFcLgeHw4HW1lb4/X74fD54PB5MT0/jxo0bmJ2dLYKKFwpbc/BeeuklvPzyy9LLV1a2RbiRTCYRjUYFcqgdHb5zQpxY3dF28zApgLm+tUNJHRornwDEYa6qqhL/iZV8IinYj0CSkZ6eHiwsLGBoaAirq6twOp0O0v7QAAAgAElEQVTo6OgQiLnb7UYikZDzhsIse2VlJdrb23H+/HnU1taiqakJ5eXlePLkCWKxGGKxmFTTaRP1+WiEdmr9HfZ5YyZ6nRqTE7lcDoODg8LalkgkJMihE0xH/PHjx1heXsbIyAg2NjbgdDrR1tYmetRrkgQ8XIuBQED68i5evCgJW/Y/xuNxGRZuVvXSPiXv7UUGijxvmFQx/kfdM9lYUVGBqakpLC4uFhEL6L4bYIvk6bPPPkM8Hsfjx4+xubkJl8uFixcvFtnI6elpfPrpp0XtHjxnKyoqcOLECVy8eFH0T1KOiYkJdHd3i69BHdG+8tzUQY6G2mt22UMbPMob4UaNRCL49re/DZfLhc8++0yygY8fPxaSgcuXLyOTycjhTSOZy+UwOjqKiooKzM7OIhQKYWZmBiMjI7DZbNJkx8GiHExEpqeamhr5vnw+j/fffx8fffQRpqen8fDhQ8laMDiik33+/Hm8/fbbQqXJTAf7Xpg1YYZ9dHRUKIKNB+1+jSezQhpOEA6HhaFpYWEBi4uLuHnzJqqqqvDGG2/g3LlzwvNO5hEyYDAyZxMiD4fKykp0dnaitrZWGvccDgcaGxvhdDplqj2fa21tTfRIp1XTYJOetqKiAh0dHbh48WJRZYOZPgCiPx4MDISpx0JhiyyBnz0sYaOiprtktUAHPPyZxWKRacHaGGlabmBr03Ki9fDwMKanp1FXV4fz58+jtbUVL730Ek6dOoUnT55gbm4OAwMD4iDwmUnn/cYbb0j2bWlpCQMDA7h79y5isVgRuQMbD1mho3OhD3sN59DPvF+96UFrhDHp7zRWsHhA5/N5TE5OYmhoCHa7XZo6SSvL8vna2hru3r2LgYEBcaKOHDmCq1evoqOjA62trWhubsb9+/cxPDwsh7Gey2C1WnHy5El897vflTXJBAH1SMes1CFEnennehHCAEsLe/Ooc024sLq6iu7ubhm0yqoVD0xmfisqKtDV1YVEIoFYLAa73Y7Gxkb88R//Mdrb26UZ986dO+ju7hZ7QEiMy+WCz+fDyy+/jO9+97tyIGazWQwNDWFgYEACew6eAyBwQFbMaSN4GDEIYFUcONyARxMlAJCKAgMvvlM6Uo8ePUJPT4+sAX4HqeAJC/z4449x7949DA0NYWNjAz6fD2+++SY6OzvR3Nwsa3JwcFASQQxcySh65swZvPrqq6JnBlK3b9/G1NRUUcBjXJPGNWN87sMkLTCzkYSVAcXJHkJZ6VCzB7O8vBw+nw8AZKhreXk5ent7MTc3h2g0Kgx47e3tOHLkCF5++WVcuHABXV1dGB4exsrKiiRBeR92ux3nzp3Dm2++KRXdXC6HJ0+eYHJyUgIeM2Yx9rhqHbIXthSRwX5FJy14PVZf9PUppOBn8MZzfnZ2VvYNnTbqvqurC/39/ejv70cul4Pf70dnZydaW1tx9uxZnD17Fk+ePEEmk8HQ0JBci/0obD24evUq3G43wuEwcrkcbt26hb6+PkxOTgqagLZS65IQbS2Hed7Y7XapBpoJnV0m+XSf58rKCnp7e6VSlkqlimwA98zKygru3buHsbExGVtC8q0jR47gW9/6lqxJ7m0mHWw2GyKRCILBIK5fv463334b2WwW8XgcS0tLiEajiMfjmJiYKIJfUU/88/MqEHoNHVToWz5PbDab9HxHo1Hpy6b/xvOGQfDCwgJ+97vf4euvv0Y0GsXm5hZF/OXLl9He3o5jx46ho6MDDx48KNIHADm/rVYrTp8+jT/6oz+Cz+dDdXU1lpeX0dXVhU8++QTxeLwo4CkUCkVIEt2bpgNMAEVsiIca8OiboeJYbga2HEWycOVyuaIMIQDBpxKrS8MBbDdMl5VtEQ6w34YvgVEjMYU8uPP5vFBM8xDWUBFmCugsMePMBatLcTrLwechDTSdlMXFRVNjsF8dMuNKA7q5uSmZ86qqKhQKBaTTaSwsLEjlZHFxEZlMBhaLBfX19XJ/xu8koxszvmVlZRKwsgdF4zrZy8MFq0vYdNqBbWjN0tKS4NVJhKA3PTMGvCcadr6Xw4a98JpGPfPaxpIyHVI6ZcYNpTMjfOZQKITTp08Lt3wmk8Hk5CSqqqowPj4ufRUswZPVzuv1wufzFQ10ZXCdzWaLqhL6GbTeeA+lnn2/RlNnnXmQ6WZurQe+Nw2703pmgyh/DqAoM0h+/rq6OlRUVCAYDEqPFCtK4+PjRZA0Pr/D4YDb7Za9QX1wv/Pg3gljzvWn712v0xct2s7w3ep74f+f5xDTMQ2FQjh58iR8Pp+wkbFKzD8DxRBZ3auj5y6VlW034bKqw/vk57WuNHSD90b9szJ5WGKsfug1p/HiZjrUUDx9X5oClXPmrFYrampqpHrOZuXx8fGi4IrV6kAgINVJXfkhDEhXJMyaqoEXO3jU7PuMNlLDS5gh5r/pe9BEF7xvJu+YtXc4HKivrxcWpnx+a25WLBaDx+Mp2ts60OHUd8KK9b1qiJeGxBqdRTM9mUEuD0uHpb5brzv+nX9mDwwDDUKmNWStrGyL1t3j8SASicBi2WJwW1tbk0qX0+nE+Pi4EAnpCjKTmyQIIsEU9Ug4G9ekmd7MflZqr+1XjLrj9/L63BfGvQNA1gCfQ+uc/c/UZ0VFBcLhMIAt0qlCofDMmuTeJguj3W6Xc5uJXgalJMKi37OTHv+vRaMLKDyn9e8YRX+mrGxr5hvHa7jdbvj9fiwtLSEWi0lFeGJiogg+SDvp9/tljiZ1SagcWwWYlNbX5nlj3OdmVb/dnDf7CngoVqsVfr9fpgQDW0Mv/+AP/gBOpxNffvklbty4AafTKY2OfX19WFhYgN1ux1/+5V+KQrRTZbfb8dJLL+Hs2bOCo4zFYvjggw8wMTEhC047C2RyohJ1dr6iokIymzzch4eH8a//+q+Ynp7G+Pg4ABRtGi6GcDiM9vZ2mVzucDhw584d3Lp169AgBuy/cTgcSCQSWFxcREtLC9544w04HA709PTgww8/BLBd9n/8+LFAjn70ox8JppSQH7fbLe/i1KlTwvgyOTmJX/ziF0V61EJ2K+OhSD2y4b+8fGv+Rk9PD/75n/9ZJrazD4O6pAPKibts3CfdMKGHhyW6kZ/60rhuOus8gPL5vPTr6Pum8aIjVFFRAa/Xi1AohAsXLuDIkSOYnp7Gf//3f6Orqwu/+tWvpFo4NTUlUADSAl+9ehXV1dXo7OwUrDuD/2QyKfACDbeizlmdJCSRz6gxwWbva6964wRxh8NR1HzIgwPYNjR6hhIDOwZ0KysrSCaTRYcADwuyI0YiETQ3N+Po0aOIx+P4xS9+gV/+8pfyPNlsFhMTE1hZWZFqgdvtRmNjoyRDiInnZ/ieS8H+AAgUR9sHTa39TcjGxoYQMrCCo7P+hLFqZ9j4HHTKm5qacOnSJZmP9tOf/hTDw8Ois8XFRcRisaKDwOl0IhKJyPRxLXROWa3nGmNgRKeJgQb3R2VlpWReNfb9MIXfr4VBn4b8GQMd7ZwxmQFszZAg/K+lpQU1NTVoa2vDsWPHkEwm8Zvf/AZffPGFQFMXFxcxPj6O1dVVuFwueDwe1NXV4dKlSwgEAqitrRW4F20Jm8tpG/Wa1NAxzQqqnT6+k8MMeow2EthKIur9rP/TeuQ70IEvYY6cQdTZ2YmLFy8KDPD9999Hb28vPvvsM7F7ExMTyOVyksysqanB5cuXUV1djVAoJGQwDHIymQySyaTAf3lGcd2ZVW5eRKBD4bvkdYzC84WBr4btEU3CvQRAiCy8Xi+CwSAcDgdOnjwpFYaamhpMTk7iZz/7GT777DOxyXQ4V1dXpXJZV1cn4ytOnTqFUCgk81HY9xKLxYRcYjfJHjrNPEeZFD0soa6A4mGTXGtGG8jAXNt6ftZi2RovUF1dDa/XK3Tcr732Gjo6OjAzM4P3338fT58+xaeffiprkns7GAzC5/MhHA6js7MTgUBA5hcBkH6oaDSKr7/+Wogl9ps0e9FBEskuaI+pT74/Jtu1vaZfyGDD5XLh29/+Njo7O6V/NhqN4ic/+QmGh4cFRcUkG+GshKW2tLTA5/OhublZEhqpVEqQVrFYTJg0LRaLVGU3N7dYDZko5RqxWq1Ftlzvx53kQAEPFUNHkqXy2tpaefjx8XHZwACEVrmmpgZHjhwBAMHd8uUQqub3+yUbsbm5iampKZmcDuCZDcCDQmccNY6XfydcZ3h4GIlEQgy9Nlz8s4YsEArW19d3KIaU96szO7w/q9WKxsZGOBwOdHd3Ix6Pi0NH9jO73Y7q6mo0NTXBYtmatMxMDx3XYDCIUCgkDqrFYinSo1GHOsO2kx4LhYJUhDiNmz1ONFaMumnA+H7ZO0Sn7kVmL4HtCgk3Cw9yXdnifXLTMMOgy/bM7tTV1eHs2bMYHh7G2toaUqmUMN7o6gwzGS6XC5FIBOFwGF6vVzLNnGuxvLwsJAq6bEt90aHQ1Qy9fvSzH0T0NfV36Yw1r0monc78smGbGVgNKaMBo/PscDgQiURw7tw5YXwaHx9HLpeTYE6/R8IbgsGgJAd4n7r0rgPAUtleOmfGn39ToqsMxt4yoDShiV63dKJYKTt58iQAIJlMYnBwsOgzGsLH52fmUjtiPEC4JjVRgSZK0OuEe4trWu/1F0FaYPxOnb3UgQ3vQVdSqV+d1GCPIWdNcE0ScjU1NYVEIoFEIiFrktckwoCQYYfDId9LJyyXy4kuzZw2jUQwPtdh7m0tpZIjdB7MMvjUo65OUo+aJIB9nJFIBC0tLVLhIeNYMpks0iPfU1VVFerr61FTUyMNzSSLYNDDwJO2kg7QYSUe9yK7TTAxINTvns+k9wqdaRJCMKMeCATQ0tIiTIqrq6sy74VrykiWUFFRgbq6OoRCIUlGs2rLGV6s4O6lKkE7wHd9GGvSuB+M/2asNGrZSf/0gZiQqaqqQkNDA86dO4ehoSFZk8lk8pk1ybPG6XTC5/PB5/MJ5FMnGUlpzf7v38fqDrB9fut+M+4voLj/RX8G2H4nHCsSCoXQ1taGjo4O2O12SQJRjO+M5304HEYwGJTec5JA6ZlyGonAe9bBrCb9Mavw7MYO7Cng4SHLQy+TyeDTTz+F3W7HwsICIpEIAoFAUfTIbACjOc4n4GICIExOVVVV+N73voeysjLcvn0b9+7dE3pBALhw4QIuXLggSmBwAGxl6zwejwwyZeT/+PFjpNNpHD16FMvLy/j8889x9+5d9PX1SVTJ72fGNJ/fGiRFxpTe3l5UVVVJ0/rw8PCBjSw3FkuLsVisiCGHQRnhTnQwWcEaGRlBJpOB0+mUQbBs2isUCjhz5gyqqqrw1Vdf4dGjR0UsGxcvXsTZs2el6kMHFoAc3rlcTuAcDodDmiuPHDkizHZ37twRXCwzbZub27NAtAPEP6+uriKZTAobFbPbpQZ2HYawWqH1vbGxIffIzUMoh/4ZP5vJZNDV1YXx8XH09fXh5s2bsFqteOWVV3D16lUsLy9Ltu3DDz9EKpWS4LGurg7Hjx+XyhaHpw0PD2N2dhaTk5OSbdOBJR16MhOxTGx2UB2WsdWU5PxODe8Dth0iHgIa50tiAuP+oE2Yn59HV1cXRkdHMT4+LlTW169fxxtvvCGGeGpqCh9//DFSqZRkilpaWvDmm29KAy4ATE5O4uuvv0Y6ncaDBw8wNjYmTGM0qjoTmc/niyC2XB+H5ZxTL2ZOI+2mzvxSt7pvgu9a7yP9/p1OJ/L5PG7fvo3BwUHcvn0b4XAY5eXlePvtt/HOO+/I/UxNTeG3v/2tJEhYYX3ttdfEKaLNvH37tpBuDA8PF/Xu6MZbHTjodaErFJrdbydM9UGF60pnoHXmj0gAvmP9PnK5nAwx3NjYgMvlwvj4OHp6elBRUYFXXnkFly9fFgaiaDSKX//615idnRV4RzgcxokTJ4TOnuyLt2/fRiqVwsDAADKZjOmsEzY06wAN+GbZr8yE1ze7D32vGg3B5NdHH32E7u5uBAIB1NTUwGq14tvf/jauXLki52k0GsX//M//CPkDsN0L6PF4BBI/Pj4uDflPnz5FLBYrqjrqs6XUcxiTCd+00AFcXl5GMpkEgCKorhGqk8vlZDjtRx99hHv37qGhoUGSw9pObmxsYHp6Gp988gnS6bQgEcLhME6dOoVwOAyHwyHQre7ubqRSKYyNjSGVSold1HBp7Qgbn4PnNwkgDiIa0qf1pHVh/DMAgZsB2/Pu+DMmkohWYJWaRAWTk5MYGBhAeXk5rly5gitXrgibJ/c239HGxoZU2TiI1GKxIJlMoqurSxJLRj3+XwTfWvTZQvtMG2nWnqADIC0aHklUz2effYbe3l5cu3ZNBpP+xV/8Bd566y35HM+bdDqNmpoaBAIBtLW14fXXX0dtba0kQYaGhqTnfnBwUFoKyLbH9aEDSbP3zSS2RnvtNOdsXwEPF+fs7Cxu3ryJiooKNDU1CUzCGPAQCw0A4+Pjpk3DAPCd73wH7777LjKZDH7yk59Ik3uhUEBbWxv++q//Gh0dHTIXgfSBANDU1IT6+nrE43Hcvn1bmhrJKNHa2orFxUV88MEH6OrqkkBKb6iamhqcO3dOPkdq2KmpqWc24UENqM40s3oFbDeJrq2tYW5uTqAGOiAoKysTp9CsN+XkyZO4dOmSNM1y9kGhUEAkEsGf//mfo7m5uYj2ks161OPs7Cz6+/uxtrYGu92O2dlZCXgymQw++OADdHd3y+JjMz0hHVVVVc/0cnDxaqPyTQQ8vA86RTRKdDCNlQv9Mzol6+vr6O7uFoaqQqGAU6dO4R//8R9x/vx5ecZ79+7hyZMnWFpagtvthtfrldJ4XV2dTLbmrJVUKoVoNCoEAbw2YUKk1CwUCi/UcaSYMRkZf0aonk5+FAoFoVHW2Rejc7e+vo6uri6UlZXh8ePHAvP7u7/7O6lSFAoFCYp48NjtdjQ3N+P111+XnjVWK3/5y18iHo8LrTJ7pnhNs4DnRQnfna566P8Y8LDaxcGChLEBEEY7wsgY8KytrcHhcEjAc+/ePWEeA4CzZ8/in/7pn3Dx4kW5n/v376O/v19gvlarVQKeSCQi2d6+vj787Gc/QzweF0eBzwPAlAbYrFcO2GZX4vN8UwGPXpN0hJnZZEVaP4OeKRGNRgEADx8+FKr9v//7v8epU6fk+e7cuYOuri4sLCwI6UNdXZ3sbSaUhoaGcOPGDcRiMQl4uCd0wKPPyd832SmIMDp1DDDT6TQ++ugjFApbDFB2ux2nTp3CP/zDP+Ds2bPyeepxbm6uZMDj8XjQ29uLr776ClNTU4hGo0KcoG3z887h/+ugh7riWavFzE7yDE2n05I5r66uljPkb//2b4vs5MOHDxGPxzE4OCjOLnv66urqkMlkMD8/j6mpKXR1dSGVSmFiYqKILEETO+ikqdmzHNZ6NTvzdxMssPrC36cDTD+Ca4JJCotli3bZYrGgt7cXd+/eRWdnJ/7mb/4Gx48fl3vRaxKABEknT55EY2Oj/F4qlRKfamhoSKCIZpXk3YpxDRxEdCCjE856XAGw3ZtusWxDgfU9MFHExNX6+jpu3ryJfH6LzOHcuXPwer348Y9/XES6c//+fQwMDGB9fR3V1dWoq6vDsWPHcO3aNWGutFgsyGQy+M1vfiMMe0tLSzIyBNiqnhnXGn0QnQzWSBwm2A4t4AHwjJHhpgkEAohEIrDZbJiamkI+n0dVVRVaWloke7mxsSHMIG63G8FgUBxQfufo6CiWl5el94Fc8PX19cIORFiUPtjYzEynh4eSzWbD0tISkskkFhYWZKCRWWaIvwdsU0XrjLeWg5Z0+Z0MEFh9IBY8EAhgfn5eNnM4HC5yItgI63Q6pZGM38tMBKkAXS6X0HOz96FQKBRNpmc2gHCzubk56W3hsE7OiUmn05IVNZYWuUboiHGuDzeWPvh1Rvigog2OhrNwfWmYjTGDZbwf6lH/O7BdNuXASpZndYmVjqzFso0jZkm8rGxriObc3BxSqZTgqBm0G6+3G2E2Z7cl3f2IUbc8WLj/jCQHWsz2ibFSpOFQNFzMOLIfze/3w+PxFDmu+Xy+qCzO6hKAorkHeqCe2fMcth41ZKrUYWZcX3wu4NmDn8/Ava2bxHXCgcxb1CmdGWZtSVxCeDEzzwsLCzLQkRUxHiY8REo5Qfoe+Vx6fRzG3t6N8Jq0Y5pEoZRjrH/GTOHm5qZkffn+uF6479lgz6GiwDZb3NramrBGsULPa+1VF2ZVwv8rMbs+n0efS1wnGnrLhIlmIdN6ZGM934GGVRLuYqwy/z6KkYBEi5ld0WuC75mwdWBbl+xj4LokMoJQQu41l8sFp9MpvhETTIRWzs3NyRxEfQ98t0bd7mQn+bkXceZwz2m9aJQInXNemz/Ta5RrTT8TK1MaJkm4G/e2w+GA3+9HTU0NfD6fJEsJo0wmk8KGa2QUo374M+3f8GzRSSGjbg9LuE94LeNZBBT7aFr4dyPqgb7q5uYm4vE4Hj58KP4Nk3WVlZVC2kTEFslcABS1N7DFggQHWp5n64yJAj7bblAaewp4WGbSL5eG6+zZs7h27Rr6+vrw3nvvIZvNSimbkVs2m8V//Md/oLu7G62trXjrrbdkUOD6+jpGRkbws5/9TCLIV155BQ0NDdKjUihsURmTalqXQ4PBIMLhMKLRKAYHBzEzMyNGcmxsDF9++SUWFhZkOJSZUuPxuAyfPH78uMBmONGYQsN2kLIuo27267Dac+7cOWmaffjwIdbX19HQ0IBjx47B5/MhEokgl8vhgw8+wOPHj6VBkSwshON98cUXqKioQH19PSKRCI4ePYrOzk4xJEtLS8Llz3In6Vh9Pp/worMhb3l5WeBD8/PzohOjcQK2DqzFxUVUVVUhEonA7XYjmUxKpYzZAx2VH1R46NK45/N5qZJoWmrCw8xEGy5tIHSfQnl5ORoaGtDW1obm5mapbNHp1AYtEongpZdeQmtrq1ArTk9PY2BgAP39/fj8888xNzdnOhjS7GDXOHo6pHRy9TT4w5ZSetQD9agzYyJBrw8e8HrehN/vh8PhkKnLdrtd5lCQlrmlpQVHjx5FKBTCysoKZmdnJRMZi8Wkz4IZe1ZFGSg4nU455KgzssSQceqw9EgbqZ+dEDd9AOngn717mhKVwvfMxAFplAltI3FMIBBAa2sr8vk8FhcXxS6zepvNZsUGRCIRrK6uyqA3wgpYJaNdI5yhUNimFTcTHbRSB7ttIj1MMQ555DrVzeXGRAvvnf12GxsbyGQyyGQyciDTKbJaraiursbCwgJaWlpw8uRJhMNhGRTLmSYjIyMyY0onM/YStHBd0C5/07o0Cm2jTljxP6fTiUAgAGDbBjBpweGhiURC+sZI0hMKhdDS0oLGxkY0NjYKRHZ+fl7IHqanp5FIJIrGCvy+iqZiNwrtUqnEB9eh1iUTs6z4xONxDA8PS99eOBwWApSFhQXU19ejubkZtbW1QmjE3oh0Oo2RkREhReK1d0pGMaAiuYK2k1yTL4LohWeptiu07UzSANsBD39GG1tWViYJCX2Ocn2trKzIDEjqUe/tkydPor29HXV1dQKN40yyvr4+9PX1FZ3bDEp5Zlmt1md6ZIjKMeqRLQqHJboKp88bYzCgAx7eM/VNSKDx3fI7bt26hf7+/qLe4vr6etTV1cnw8Ww2C6/Xi46ODoTDYaFKZ1IyHo8jkUgUnTfPC/60vdbEMHtJru3Z2zRmbJlldDgc8Hq9qKioQDKZRDabRWVlpVRmvF4v5ufnpWRls9lQXV0t5AZra2sYGRnB9PQ03G63/HsoFEJjY6MoKZfLyYGmDwJdkuMi4gG4tLSE6enpIippbbD5942NLR5/lkmdTqc4R8bKAVkiDiI6S0KdOp1OVFdXi5OyurqKpqYm4S3nJrTZbM/cJw3CzMyMkEM0NjYKU0YoFBLoASEzuuxpzOATWsOs0vz8vBhMvUmZ1dDNmcy06syz7o+hYdpP5tNM9Cag6Ez3XrMpxqyXsRzM6iH7RBgUMNgCtvCofr9fHHg6w4uLizIvychSp7O6+j608N+Nz/eiRGe5dXaPRt4Y8Bqfxfhv+ufUC4f/MjuvaWe5fp1Op9Dnkhghm81iZWWl6ECkAdTNmlpHWmdGI1oqQ7sXMcvkmgn3gLHHROuLutbZb1aFWYFhYMjgWzfREiKzublZlHFj0MV9TZpanQygbd/NHjVWIswO2Rctxgqe3vPGtWh2hjHgIXyQTd60tYTFcmSA1+stGtzMOW7z8/NSedyvg24MKn5fhGsW2L5H6k6jNfSe4yBw7rG1tTVBfTDpQRvJ81vP4NFDug9y3y9a+Hxm19vN/uF3ECWgUSBcl3Nzc5idnRVEC20fe1J9Pp8QH/D85hnOKlGpIMVoo3WF2PizF1lt4zXMzg8zu6LtjoY4aVYvfp4BAc9fUiWvrq4WEWZxmCbXI6u27EM3mwPF6xvPZLMzWj/jYcvzqtn8O89as9/XlTSjMCEEbNsAbfPYo6b9JH3esLqzU/LZTErZw518JaPsKeCx2Wxobm5GKpUSRirCH7744gvEYjEZtkhHgwuPZUNmd6empvCb3/xG8IFcPBcuXAAADAwMYGBgQKhuNzY2hK2NmRSNTezs7ERbWxvW1tZw9epVUbiRko/i8Xgksnc4HMKrnslkJEuzvLwMp9OJlpYW5HI5YUcJhUJoaGjAkydP9qK+ItFMWIVCQapc3d3dmJ6eFogO+3uWlpbg9XqRTCaFRtHlcmF+fh63b98uGv63sbGBuro6FAoFRKNRjI+PY2JiAvfv3y/K1hqHHpaVlUnGDQB++MMfipPOhUkngEaT04jp8FdUVEhfysbGhgRfzF7rYOiwD3PjgtfDKvdz4On3Q+dxbW0N0WhUBoZGo1G43W5Z62R0YmaflZ10Oi1DdgkVZKVRO7nUh6anNt6HrqqQyIK9IQc52FkRIQSMe+ZkRfIAACAASURBVHsnPW5ublMFazYV9kfpmR58BlZVksmkUFivrKwIa1hlZSUSiYT0QuXzeYFilZVtzYl58uQJhoeHMTw8LPBKY2VEVxrohFksFnGoGEzx9/mctBX7gRqwWqCHpfJazAAaA0jqnvehD0LSshoHbhJ6xUCPyYjl5WX4fD7JkjI7HggE0NjYiPb2dtTX18Pv96OyshKpVAq9vb2IRqO7coS0U6cTCUaYMN8jsN2X+CKEySeLZZt0RGc5+Q5LJRU0fl33983MzOBf/uVfUFNTI3simUziyZMnAik6cuSIsAWur6/j4cOHePToEUZHR2W2m/G6+l6oS9pE7m1WinUQrO/tRemx1J41ihEyo6t//Bn7cRKJBP793/9dknIOhwOzs7MYHR3FysoKQqGQMDWScGJ8fBzxeBwDAwNFbGL7EVb5DorIeJ7oPaLJKPTPjLbTzE5qcgPuJyYq1tbW8Otf/xpffPGFDGxNJBIyOLK+vh7f+ta3xMnc2NjAkydPMDg4iLGxMcmwmzEd0kczJo51UpnrWSdqX4ToSizt+m4DXr0mk8mkaaIum83ivffeg8fjET3Ozs6ip6dHzmVCLQOBgCRCUqkU0um0DL7V9tJ4bhuhdxaLpUi3REgc9Lzh2cD3pM8YnRyjjdTv03ie63/TA3CpN85lo23XZ9fy8jLGxsYkWWSxbPVUVldXIxAIwOPxoLy8HN3d3bh//z6GhoZMofw7+YO8Dz10dK+JkD0FPFVVVWhra8PGxgZmZ2dlU6ytreH+/fu4f/++GHGn01mUhdSwgIqKCszMzCAWixUp/MyZM3jllVewvLyMGzduYHJyclf3VV5ejsHBQbS0tKCtrQ3f+9734PP5MDk5iVQqBafT+YwiXS4XmpubZTiXzWZDIpHA+Ph4URnVbrfjyJEjkpXP5XIIBoM4duxYEUX2XkSXaoHiBr7+/n4MDAxIdFxeXo7p6WnMzMzA5XKJMVxZWRE636mpKYEWkDa5+f8jJXj48CFSqdSOC6myshJerxdVVVWIRqNoaGjAiRMn8OMf/xherxe3b9/G06dPJVjSC7WyshKBQAB2ux01NTVwOp3o7+9HLBbD+vq63K8WY4/NYYiZo38YUBD9juhETU1Nic6/+uqrot8njMNut0t1y2KxSDMkSQvoJBjvm/owNljreyGUlJURDY86aMCjoYG8h530SIyzFt1EaoSPamwwWbIA4PHjx0VrlMaNiQ0yYAFb73VgYAC3bt1CJpMpmW3T70zDJ2kwiT02OuyHEfAw0KEOzKAD+j71u9MQCM5z0j1G/AwDTR1QGPVYVVUFv98vk9abmppQW1sr83cymYzA2cx0aAzIGBTrezKDZTCRZLy/wxYNGdQ9PGb9UMYssHZKdLDO4OY///M/i9Yu1yT3dkNDgyQ6lpeX8fTpU3z88cfPDNEDnq128p1r9ACDXa554wC/Fx3w0FHajYOpgzlSRhu/z+12iyOpG/atVivcbjdcLheCwSBOnDgBAAIxjcViePr0KcbGxkyhNcbA8Xn3+U3N1+L1WF153vviuwa2+3XMyA1qamrg8XiQy+Vw8+ZNgW/xeoVCQcaBnD59GgCk4jg4OIjPP/8cmUzGtBGc65IOLp1VvYeMz6eTXwc9b0p9nv+2n2CXeqSetO3c3NxEMpkUQghtK/P5vJx9rPz4fD4Jltm7Q6ir8X4B83PbrCJF3WofaL/njc1mE/Ip+gb8TqKA+DPaJbNrMXnJvWs2soAsvEzk8rmz2SxSqZQ8O3vvfT6fBJWbm5vo7e3FL3/5SywuLpqS2ZSqOPE+gIP5dXsKeBjlUmlUpMbyMSonvCedTsNisSAUCknwcOrUKakCFAoFgWMwC1ReXo6Ojg4Eg0HMzs4ikUg8k+1iYEWqVfZVhMNhwWkuLCxIRM4XzIDL6/Wirq6uCNZFeBKwtYCZOWbvApWczWYxPT29b0NqzOoD246uNiiaho8Lu6mpSQ55Os+a8hTYxt4T0uZyubCwsCBlSH4fdVpeXi6Lsrm5GceOHUNjY6MEYvPz80IGwXfNd6HfGzNUhLIB25mtvZZN9yq6qe4gRpiymyZ2PpeGRdntdjQ0NMDlciEUCsHn8xU5/8SmZzIZ02ffzb3rzJcOyA4qNGw6670f0YclM/BmcA8zKCWdUa5hh8OB2tpahEIhyc4RxmGEgT3v2YxZaOpRZ9j3Ww00XktTZ5rdo/HvOgjSsAgGaVqn7PkxI5Ax7u2ysjJ4PB74fD5hv6qsrBR7RiKXbDa74zo3+7te+0biCma5X7TwmmaVMmAbbqv3sVnVRYt25viMtL8c1hoKheB0OrG+vi69oXSEzBjtjNelGNmRSu3tg65JI3GH2b3pxMnzfl+LTnAwcUAUAkcfGKHGTqcTLperaFAwnSr2iM7Pz3/jsMiDiLadu7VJtD/Uj6aip7NPv8RYeaN9IHMj9cmAi/o0Drw13gPfG5MXOzmc2k6+KNF7QNuz3ejUaP943zrBwGtoYcKWM/Nqa2vhcrmwsrKCzc1NpNNpJJNJoUUvJTqZshsdHXRv853owE73s9Av59+NdtqYiGEyi2tHw/GYrGP1SP+M92Kz2RAKhSTBxqR9KpXC6uqqoIN2QyTzImRPAc/Kygp6enrkIGPznM1mg8fjgdPplH4ZYGt6cF9fH9rb29HZ2Qmn04nvfOc7OH/+PG7fvo1f/OIXWF9fR11dnUzEZbXlpZdeQmVlJT799FN8+OGHkkXa2NiQbITT6URjYyO8Xi+uXbuGy5cvC9RjYWEBo6OjGBsbw+TkpGTKCI1paWnBhQsXUFlZiYGBAWHfmJycFLy7ZjjSEJ/JyUkkk8kD0dsyUtY0x1y8NJzZbLaoES4UCuHNN9+EzWZDf38/pqenMTExIeVRHsx0tisqKhCJRLC5uYmuri7cuXMHwFafEOfgsFLU3t6OUCiEt99+G6+++qrgLefm5jA0NISenh7Mzs4K7poHu91uF2ggh7guLy/D5XJJhrpUWZrZ2MMQlm8Pwzmgc2O1WgUHXeo7aQxY5g2Hw7hy5QpCoRBOnTqFlpYWaSzNZrMYGhrCvXv3hNFJC9//bp8VMM9g71eYeTroocb3TT0Sgme324sOLxIE0DlmoMzqZnNzM/x+P86ePYtz585henoaX331FWZnZzE7O7urwMwIX+JzAsV6PKzAkXqjjWIvgj5ggGf7TRgY6p/pwYrUEwc76uoehXu/vLxcMpwOhwNHjx5FTU0N2traEIlEkM/nZa+OjY0JvKhUlcz4fyMclTaKNpL3+01k1jWsmQEz9xETQxx0x0Gq+l0YK8x6nfCwZ5Ksvr5eaNEvXryIUCiEmZkZjIyMIJlMyjwto4PP79VJLqNTpLOXGgrDfzuI40/EBYdVmgmzu9qWkQDmeRlXu90uNPAkFGFiQuuTQr8hGAzC4/GILlZXV7G0tITR0VE8ePCgJMb/RTtF+xEGDczw7+Yezd61w+FAIBCQSoTuU+TvaWZGt9uNlpYW+P1+6dfl3tM9uDsFMpubm1hYWJD3sNP7Zh/b8+BHu5FS12GAxoS6xWIRyP9OQjvENgmuXQ0NpJ3iGUUbEA6Hcf36ddTV1eHKlSs4c+YMlpeXkUgkMD8/j/7+fjx+/FgCT7Nn0ddntXI3OjjI3uaZzbOWyX4+L6mneaaQTY0BDZNzwDaygO+ZveKEkpPAhoFLeXk53G53EfFUdXU13nrrLdTX1+PChQtoaGjA4uIiHj16hLm5OUxOTu54NhyG/7aT7JmljdzmPAgI3yH18cbGhlQAyLxECA+nWbNkprNJPFQACGMGh5PS+OqsJ/sjgsEg/H6/ZIEXFhaENIGTmfXEcDpfNOo6+mVDNA9LvlzjwjXO9tiPPC/LaAyCeJ+kT9TPQH0bv7e8vFyaQXUfk9Yj+dh9Pp/QMVKPs7OzkrnUA1qNWQFdPqXDs9umvMNa3Ie9UbRRN8seG50Xrkm73S5D97xeryQByBLGHiiz4Zz8vuc9x4s0CodV5TBmdI2MfDp7Z6ySVVRUSG9YMBgU2loG6RxwauzbMYrxUDarVLwoPRrXjl4v+rqlrm9cf8YqGFDcQ8PPUH+EWrGRORgMwuVySRBPKmr2Cu6WKcgMdqjvV//bi8wCazF7j3rPPs850zo0eybqkUOEGxoapN+sUChI9ZwQNLMeCbP7M7vvF7UmjWvJTHQ/gbHJ2uz79J+NzeE6w86f89yx2Wxy3tAh02ctm5pLVSV+X6XUuytlg4y/Tx3tpEueqTqJFAwGBVbOhBITHmQpfF6FxPiujM9lvOfnrY+DCG2H7r8xXm8nu2nsjzSeRfrfNZsge7ODwaBUbznihLT9mpTI7L4PKxjci1AXPEt1IkXrTd8f/6yFuuHnNURYV3o086W+NgPU2tpaKWIwiUeSCFbMzHT4Tez1fXECk+89GAyis7MTDodDshCkO2WEOzk5ibGxMfT29sLpdKKtrQ01NTWYm5uTSDuZTErESOwkqWQLhQL8fr9kitfX1wWeceTIEXz/+99HfX09mpqaEAqFkEgk8OGHHyKRSBT1UgBbL9TtdqO6uhrpdBr/9V//hcrKSpl743K5YLFYhGa7trYWg4OD6O3tfSGl9VJwL112ZASfz+fR39+Pn//85+L46RKhzgITKujxePDSSy8JC47X65VM5+rqKmpra1FbW4tIJILXX38d4XBYKC3Hx8fx0UcfYXZ2FlNTU7DZbEXvuFDYgrNls1n09/dLpQrYhoToTfP/p4NLZ6h5QGv4JoMWisViQSAQQF1dHSKRCNrb2xEOh1FXVwefz4f5+Xk8ePAAiUQC8Xi8pC6M0JD/CzgHHWUN99qvaD2S9YpZRGAbAsLfZVWDsMC3335bKNVJdT4+Po5YLIaJiQnE43FTPTEDymvsNYgzBil7FRIraLIHLdzTRkeC12Yvhe4F4DMSm89MfFVVVVEPDQ80wtg6OjrwzjvvoKmpCR6PB2traxgfH8f//u//IpFI4PHjx1hYWEChUCiatk59mTE0ca8zS2h8dp1MAWBKu74XeV7QaiTs4D1Sh0aImP6srlaZOQMWiwXV1dWor69HW1sbLl68iMbGRoTDYRQKBWQyGdy7dw/RaBQzMzPPODtMSJFli9fdy9rSFaH9CLO+hNyaNdUbe3hWVlaKdMbsr05wcX0Tuk6bod8Fq2zl5eWoqalBdXU1IpEIvvvd7yIcDiMSicDn8yEajaKrq0tIXzRBx2HKQXW5V2GFkcKKpDHAoI7YNqCrlMb1Ula2Na+P+nv77bcFPp1KpTA5OYmbN28K8QurjlzXO+mViTu9hmm/v0nh87OHkWtX/7tRj/q80U61TsjqvhGLxYJgMIja2locPXpU9nYoFAIApNNp3Lt3D/F4HKOjozuONOHPNBkBr6HtqrHaWSow261w7Zj5Wvy/pshmBUpDjmmzaaN0sornDX0T7edp8Xq9MhqBw1rpb6bTaUFRTU1NCVuyma+j7Y1+Rt6nxWIRmOx+ZF+01MzQVFdXo6mpCU6nUwYO6XI2p3UDwL179+B2u/HWW2/h5MmTwtq1ubkplJXMVpCzm5udAx5pUFmJaG1txR/+4R+iublZrrO+vo6vv/4aExMTOH/+PNrb2+XwY6XD7/djZmYG3d3dqKqqwhtvvCHQPDocR48eRWtrK3K5HPr7+1+I82nmDDHrrX/OhRyNRhGNRuU5NOe/3uxkZuIUe7KxsdGMUbbX60V7ezuam5tx7tw5hEIhaWybmZnBgwcPMDMzA5vNJoMzmYXjQb6ysoJoNIqKigqZqaKfbbdY1t830QaC/VAej0ew7Vy/wHYgzexvQ0MDwuGwZNU3NjYwODgokJdSYmz23+ua20116Hmfp7Oqg5GDCPW4UwVBZ4ipg2AwiJdffhlHjx6VrCVnIsTjcSSTSSE8MAqdLABFDHa7EWPFcq/CA4xwILN/4/vVvSL6d5h1NHNMjX13Gu+vv4NV90gkgpdffhltbW0C200kEvjyyy+F1GV5eVkCeuDZ3iqK7i0yczh47zoYs1gsBwp4jIFIKWfDqEO+/+dBYfhZrj+z63u9XjQ2NuLIkSPo6OhAJBIRHSwuLqK/vx9jY2NykOtgidBGHtT73Z8HyRjzXREZoAlJKJr8gRAofW1N764DXjrwxoCb19U6qK2tRWtrK9rb2/Haa6+hoaGhKPkxODiIWCwmZ//zKlJ7Fb23vwnhsxvPabPqFyFqrHBxTdIXMOrA7XZLEH758mXU19eLXeS8vJmZmaJxHLtZQ7S/xiSDGfz6RScxNVzVbrc/o0ezM9Jsr+u+GgbkXM8ejweRSATNzc3P7O1sNou+vj5MTExgenr6uS0MOkGkRbcu7EQMsx+hzS3VF0MbziQ1k0E6ocmAXLdtUPR5o+cM6u8HIDT9dXV1OHLkCI4cOSKQ1MXFRUxOTiIej2N2dhbLy8tCasOklFnS0qyKTHvwjQU8XPzZbBYVFRUYGhoShrNMJoONjQ0cOXKkyNFdWlpCOp1GoVBAPB4X6mJWcti3Q1yv1WrF2NgYJiYmMD4+jnQ6XRQdk3Jwbm5OXho3+9DQkODRU6kUKisrkUwmxcGYn59HefnWTJjGxkZUVFRgcXERIyMjwmZWKBSQSqVQVVUl1NTMUPFZE4nEC6G51CVjXb4uK9seXMWNox1Uq9WKcDgs8AtOs47FYlhYWMD09HRRWRzYcgZSqRT8fr/8G2dyUJ/JZBIOhwOVlZWyUHmP7EPifRMeQ/pmM8gR8dtOp1N6MUoZgt0I9XOY/UBa2ICbz2+xJhGfq69ttVrh8/kk88uKGqmCR0ZGZNCWWfOpvpZxaNg3LRrf/E0JjXJ5eTkaGxtx+vRptLW1yYRmrqtkMinDyswYXih8Bv55rxC9g+heVxy4N4ywDO5Z3aOhqzg6o2XMqO2UQOA1Kysr0draimPHjqG1tVXm7mSzWdEfh2QaKzj6+vreNTMbHQI6Y/qztA3sKTyoGN+FbjoupQfj+9+PsLJbVVWF+vp6yVpy/xPqOzExITTzrLAb3+NhyEHtAdelkT6cou9VM8fRiTI2gO/k8Op/o20vKytDMBjE8ePHEYlEYLfbpVrOdUk2Ut3YfNhy2HZVO2LGM0if0/pnZhVfI3mKmbCNgEysp06dQiQSEf+E+47Ij4WFhaIsvp7vY7Q5FJ53Wkq9h2/qjDKrJh8Edq3XZygUwksvvYTGxkZYrVbR3+rqKuLxuAy+NbKy7UWMfVpm97Nf4TvXwR/XI+00sG03te1moKNnHnEd6aqTPqeMiSUG9M3NzbK3/X4/qqqqhHFwcXFRfGatR31NI7lCqcQE783IbslEHIAdfcl9QdpYwUmlUpiYmJCMJoOIq1evwu12i/EfHx/H3bt3sbKygkePHuHx48eSEXc6nTh+/DhqamoEk5pOp/G73/0OExMTRdOzOV9idnYWk5OT8Pv9guV/8OABvvjiC4yOjiKTySCXy2FoaAhjY2NFmdJYLIbp6Wk0Nzfj0qVLAIAnT57g0aNHUvbP5/MYGhoSyAy5xF977TXU1tbi5s2b+OSTTw5EWlBKuKjIvlJRUSHZDS4clnpXV1elzGi323HixAkZLspS5L1795DJZCSAYkRfXl6Oubk5DA4OwmazSSA1OTmJ0dFR9PX1ob+/XwJTQiFY7eEBz+Bpc3MTqVRKDlSz7DWwNf/o2rVraGxsxN27d3Hnzh1sbm7uOwvMZrq99CHsRXjwWiwWKa/zcGJWnPOpzp8/j1AohObmZjidTnz55Ze4f/8+hoeH8ejRIwnczfqtAJTM+u9WDsMp2un+XqQw4Ll06RL+6q/+Ci6XCzU1NQCARCKBqakpWZOlKJQpRujCXoOdwziANARDBzo0yqzk0cCvr6/LPeugSM8JArDjZG7CklwuF65evYof/ehHMsg4n89jZmYGvb29GB4exszMDGZnZ4ucc31Q6vtlxcR4EOqqHGGQrPoQjncYoqswrMLvhKXX73+379L4e+Xl5dI7dvHiRbz77ruy10lB3dfXh4GBAamUGZ0wI1Ruv3JY2fTdELuw0kOKYk08sJsAxPi9hLzl83m0trbi+9//PjweD4LBIMrLyzE7O4vx8XH09vaip6cHU1NTB2aJ3OneDtumcZ9zTRorIfRfdroHVmifV80iusZut+PMmTN499134fF4UFNTI4PQOUiY1R3uETLa6nWo3y/FLNDcTVX1RYuZHncrZnuQVYsTJ07gT/7kT2C322G327GysiLJyadPn+Lx48eYmpo6ECMv/bEXoUcmYrWNJPMhq1rGs4i/53K5AGwnO5gs489YlaYdNyY6mBRyu924evUq/uzP/kwQVNzb6XQa8Xgcvb29RXrU54tmcdVVXaPN1GuZBA0kpmBPm8VikYqmmewr4NGZDMI2dJZPw6eALbY2KppTWLlxOaDM6/XKQ2s8oc548BqMTFnKW15eRjqdxtTUlLA30YgYD139fTorqbPaxDDrhajJEkrBHw5L9PMSYudwOGRCtTHi5u9z+jIZNjStJbHEjMoLha15Ehz4Rh2QT31ubk6+Q1MPljq8+flSWF9+hhUoBmo6C7Ff2amBUsMrdiNmv88sNjHVvCZJO6h3Viz5bEtLS0gkEpidnZUhkfo6mjKX19trRnqvz/e879rJABszlWb/brwf494FUJSVoR7oTFZXVyMUCknPXqGwTY3O+SZG+NbzIE+7gcUcph6NDbdGvZVyivXvaAw4dQUUw8r4uzpA4loMBAKora0VW8kG3NnZWaGy10Gjvg+zRlfj+zR+xgg/epHOkPEejbLTOjC7N7PvYT+p1+uF3++H3++XLOna2po4laRbNQbgxorXbvSxm3V6ENH3sdN61w6H/j3jZ3cjDMLpGJHNlfZ0cXFRoJY72UijH2C898Pcv88T/Z70uWj8Hcrzghj+jtnz8M88bxwOR5HPpGFB7JMkJPF58KlS73GnM+ib0rPx3nZafzvZAeO/0XZyTXJ/0yeineTMHeOa3Mv9mv35RYiRlMHsHDb+zGx9Gv1dY9JLn0va//F4PAgEAgiFQuJn0odOp9PiS5bSo646Ge/HeLaX2nea7GMn2VfAo2+KF6WzV1FRgbGxMbjdbrS2tiIcDmN6elqcYSrM4XDIvBLiiklLmc/ncfXqVVy+fBnxeByxWKxI0SdPnsTJkyeldygajeKLL77AV1999VzFVldXS1/FnTt3UFlZibq6OnR0dGBkZASPHj2S+6DR4KyFlZUV2O12xONxqYgclugFyLJyNptFZWUljhw5goaGBszMzAhDlX75S0tLUpkiRI+DLi9dugSr1YqZmRlMTU0B2MaU/sEf/AGuXLki7C6xWAwPHz7ErVu3kEwmJejjNHfttDK65+LeyclghphZ4u7ubgwODiKRSOzouBxUuPmYbX7e+2KWgMEyKzsMwu12exFMyefz4eLFi6iursaJEydQXV0Nt9stn2dlM51OPxN4V1VVwev1wmKxYH5+fkeIVilhMMwEwUGgaHw+YybN+DvMohidPL5jjfPVeiR0lT17a2trcLvd8Hq9qK6uxquvvopwOIyzZ8/K9Hpgy9GJxWLo6urC2NjYjnrcie5SZ6qMQj2Wl5eXpPzeregEA5MTumHYeHCwOqKratxv3FPUO7N37LWgo2O1WuH1elFbW4vr16+joaEBR48elX47Qgvu3LmD3/72t0in06bVaR5u+t5L0RJzX5BBk/uLv0sKWAA7Ztz2qttcLieHG/sFKby2WY+Knm+i+7qMs6H4f4/Hg8uXL6OpqUmIeUjfu7S0hJ6eHty4cQNzc3PP7F3tdGi4yfPsj/FM1T0ch9kLqfexntHCdcmf0SbofayzwJrR1CwwAQC/348rV64gHA6jvb1dmOz42Vu3buHGjRsC99Vis9ng9/thsViEBc/s+mZ220y007dfXdJW0N7qxnraDZ1lN4rWr9mzGElBNjc3ZS/5/X68/PLLqK2tRVNTkwQ27Ml98OAB7ty5g8nJyWfWJKue2undKyyMtuEwzhvqyewejEQP3LOkqqZd0T8zEi1ouB7XJGH+gUBA9HjhwgVhF15YWMDy8jKePHmC7u5uRKPRknub98Xqgr6+sTJiFIuleN7NYVQzNQuqrqIYE4F6XqZxr3JN0PbQ/tBukrxCnzevv/66DKrnmuezf/XVV/jggw+QTCZLngHaznHNaxut7TZtqXENA9sFiefJvgMe403b7XZp6mZjUmtrK7xerwyl1A4SFx6DJGCrWjQ3NwebzYZjx47B6/ViYGAAZWVl0vwEACdOnMA777yDhYUF9Pb2CgvE8PDwjhu4rGxrTkUgEEAmk8HQ0BDsdjuOHz+Ozs5OaRZkwzEdZS76RCJxGOoqqUNg+9DTG8HhcCAUCmFtbU145GkoyDdPw8kG76WlJZmvEwwG0dvbK4vO4XDAZrPh4sWL+OEPf4jFxUU8ffpU4AVPnz4tmhPDkiwXJ51bbp6djKfOPrMpmlOOdVR/ECkVbPEg5EZ9nnE3bm46RTzQOQ+JfydLIUkKCP0DIOyDIyMjpo3TnKFQVlYm85D2KhbL9qwWYH9N9vq7ND+/mejGZjPGGTYnU+js89D2+Xwy32ljYwN2ux1+vx9NTU24du0aWltbpRFfOybpdBrj4+OYmZl55poVFRWix2w2u2O2r9QaYLZKOxoHETozvC57wMwCHt0wqh1243wd6kTvOTocxPX7/X6cPHlSmDC5b+fm5rC4uIjh4WF0dXWZVmK1k87KK+n3S+lMsw8Z14ze74cV8PCZAUhlWot2vszY47i36ajqSpnx8Lfb7ejo6EBHRwfq6+tlkPbKygqy2Syi0SiePn1ackQB1+FBnEI6AmbPdxDRjqs+l7kuuT7oIAIo0hn3uLaRpc4Bp9OJ06dPS/KTTiobmvv7+3Hnzh3T8Q8kiikrK5PKBYM1baPp8Gp7YyY6YXeQgIdJPuqs1For3+obWwAAIABJREFUFfDoOU9m543e34XCNpTT5/Ph2LFjiEQiQu7EgGdtbQ0jIyPo6enB3NzcM8627s05SKJWnzcHCcLNqsIUntsUrTO+awDP6FEHIzzH6NgzGUxirPPnz6O5uRnNzc2SFGW/yeTkJHp7ezE7O2u6t7XN0NfX73un84bPoZ38g4omI9CjQZgwMV5jJzSOGZqAgT0DHp7dJ06cQFtbGxoaGiTZSdj1wMAAbt68WfJaujpD28F3pROP+n2XgrI/r+pP2VfAwwnorEIw87awsCDMXVarFU+fPkUmk8HExARsNhvKyrbZxWw2G0ZHR+FwONDW1iZ9IdPT0ygr22IKs9lsiMfjmJychNvtxvnz5xEIBNDQ0ICFhQWhXZyZmcHMzAwKhYIMLaSRzOVycDqdQjjAMjBZa8rLyxGNRrGxsYFYLCYHH42Nw+FAdXW1OKhWqxXxeBxTU1OHWuExKysCW5uKNJ2zs7OSzaEeid80Mm0sLi5iZWUFT548gcvlwszMDJaWluD1enHy5ElUV1fD6/UKOQFpk6PRqAxKtNlsRaVEDpgtKyuTDL9ucjfeu9FBy+VywnlfXl4uQ9EOqrdS2VPdpGusPJgZAeO9GzMkOnvILFcgEEB9fT2CwSDcbjfW19fx9OlTLC0tYWpqqiibTMea2RPjYD6dKd0tJTQN20GaOKkTzbqlDxFtfCi8V+28m+mQxAPMFOtqINeOcf0wCJycnMTCwgJGRkYwPT0t1LfaqBmNcikjvpM+9f2UCp73KvrA1Y61xVI8cFIb+Z0gTdqg67I+Aw/CC2pqahAOh+HxeGC326XfhH1QfI/GYEFP0aZOnifUFfe51qEZS91ehd+rr8f71+/azGYahXaRv18KFsWg3ev1IhgMCiKA8Gn269AZ0nvb+N1a9rO3adcOq7qjcfJMYDHRoYMr3eCsnXmdQdbvXtsC7aSwKtHU1ITW1lYZJ7G0tITJyUnMz89jdnZW+nCBYqTD5uamJDF26t/QPbo646sdc37uoHrUvgEdtd3aaX6O64zPpXXJ3+XfuQcIa/f5fAgEAvD5fPB4PMhmsxgeHsbc3JwQFK2trYl/oPuK9Pvmet4LUkUHZget7mi/wih6b9Pe0c7ptaD9C34ndayTwvxdSkVFhUB+6dPNzc2ht7cXiUQCo6OjmJ2dlYrj8/a28ZmA4oCaCST9HYddtTWuL92PCRQTJ/Dd7WTrNYKAPpT+Dr4DjjuhP5fNZjE+Po5MJoPZ2VlJENNHYeIkn99ijqNPxL3Ee9OQbt6nkQRIv2+eN4ce8FgsFuGA56TuXC4nk+T1DU1MTEiznMfjgc1mQyQSQSAQELgPh176fD6k02n09/dLJo0ba2NjA6dPn8YPfvADnDlzBuPj45iYmMDQ0BB++9vfIhqNygax2+2IRCKwWq2YmJhALpdDMBjEpUuXpLmdB0k6ncba2pqQFmg4D7+vrq4Ox48fh9vtxtGjR+F0OvHJJ58UsZ4dhpQyOhsbW5TGo6Ojog+r1YqGhgZUV1cLMx4hL4VCAUtLS0gmk1hdXUVfX5/8O3sk3nzzTRw7dgzz8/Po7e3FyMgI3nvvPcRiMcH4EypEuE0+n4ff70dzczPKysoQj8cxNzcnrGxmpVkNcyJdua7saQjjQfRWyvgyA2a1WiXgpp7ZJF5K70ZMKBtCec18Po9QKIRIJILjx49L02M0GsXHH3+MWCyGJ0+eiG5onDkbipl3XVEhTKdQKOxqsjTvhe/nIHrUzY/AlnHxeDwoLy+X+QMUXZI3y97wO8rLy+H1esW5NmaA+ewMqGiErVYrFhcX8cUXX2Bqagr3799Hf39/UZlbX4P3Qgz7fp/fGIwcRPhMOnCkcK/w3XF9AKX7OPR61IEhABnC7PP50NLSgo6ODjlkJicn8dFHH2F4eBijo6OyH1wu1zOYZyNUYydHSDsVzLrzEGNygJSy+xUiB7TeeE1+v1FHRggHRTfCm+mS1yP0kvSqzc3NsoZzuRwePXqEiYkJOVsAFOnRGEzpdcpn2c3e1sHDYQmDOQ3xZe+cFsKP9bR6/VnaTeqRATcdoXw+D4fDgUAggEgkgnPnzuH06dOyJicmJvD06VNMTk5iZGREkBt0aqmztbU1pFIpAOZ0wxQzohVm8/X5sFOGeLfCxJ1ZkGf8Pb0WNjY2RG+EqOkzyBgQA8WwUbvdLkRPkUgE1dXVqK6uRjabxa1btzAxMSFkJFarFYFAAACQTCZlHzLRxqQve/p268dwX2s9H0RKXVfbDs1Ua7PZRI8ApAKpgwk9P8/IOMbfqaysRGNjoyAKqqqqMD8/jxs3bmB4eBiTk5OYmZkRe1OqN0Tbah3o6GCL0H9d8We15LD2t4bG6Qq9DhZ0gMC/62qn8X1yr/JMNSIQSEQSDAZRX18vfkIsFsNHH32EeDyO8fHxoqR5Pr81zoN+LFsx3G63VKfYd25M6gHb1UUdQJETYCcovpZ9BTxVVVVwu91yoFNBvBlm05nBLxQKcLlcRQ/OzwBbBwBpPtkoT0fR4XDA7/cLU5rf78fo6KjQqy4uLhY5OTxYmPFcXl6Wv3MDMGKlceWm0PhALlKXywWXyyV4cZb1HQ7HC2FpMxM9aMnoQOiMDSNslrjX1tYEPsRBscFgEH6/XwLMmZkZJJNJmSTMg5BOjNVqLYLOUPTG5gLVcCfer85uG51JvWb2y4LC731e9l5vkp0cWp0NNAp1z+CGc3bYA8UDbH5+XpgCjc6pvo7Oduj73a1wL+1UGdiL7CWr/zyHmPfF56Oh1waXyQ7CXnUlkIdxMpnE0tKSBAg0gPo9ra2tSYXHmNHbbcViN8+0V9HfWcrx1z83u1euW+pPH2IUJhFI719ZWYmVlRUhe5ibm8P8/HxR799Bn1Vno/Xf9f8PEuyUup4W4/0bnQ/9Wf0euIa0Drg/Od8kFAoJ9JcHNXsj0+m0HPhGx6LUPRjvx7hn91JZO4joa+/Gbur3a7bHdNDDNVpeXi7EGX6/X1hGSaazuLgo65I9GPretC50lYs/M7PfZs+xm3exH9ltMgAo3idmWWutS/0zOvtExdBOMmFmXJPc3/oezGyLUczW4vOe/ZsQHUAY78/MGdYJGKPdZQXB7/dLZYd7e319HZlMBplMBul0WgiGWDE02rHn2U9jZcnsmYx/Pgwxs4XPe+dmos+bUhUytoUQNUXfc3V1Fel0GslkUkZHmK1z7QsZzwvjfe2013Z6xlKyr4CnuroaHR0diMfjUuGpra2Vpu3GxkYAW8NGh4eHkcvlBJaVTqcFMnD+/Hnk83kMDg7KxO+5uTmUl2/NvHE4HLh69SquX7+OmpoaHDlyRJrzfvrTn8rho6Wqqgq1tbXyUkj3yEzGzMyMVDB8Pp+QFng8HgwODuL+/fuorKzE6dOnEQqF5MUuLS3h888/lx6jixcv4t69e3tVn6k+zaJt48+YaSADWDablV4B0vcODAygt7cX2WwW8/PzKBS28L9WqxWXL1/GD37wA9TU1KC9vR0ulwsDAwN47733RO8ABJ/JgVzsv8rnt1g3hoeHsbGxIZA5XXVqbm6Gz+dDIpGQPh0d1AAQZp719XVYrVZEIhEAwPDw8L70Vyg8O7W+1O/ROS4FwdMwHP6Ovn8Gzq+88gquXbuGcDiMY8eOwePxyFDYyclJGVRGzLnGlrInjNlQvaF19mo32R8++26naO9FNjY2MD8/XwQh0EZQU9waRUMSGIxoHTDYOXfuHK5fv45QKISTJ0/C7/cjHo9jeHgYIyMjuHfvHmKxGDY2NuDz+STrx++nvmZmZgBsM0ZqikrKTk2khDtp+AR/flDR5X/qQK89Y++QPky5F6nHXC4n1P1cy4VCAe3t7bh+/brMMcvn83j48CHu3r2LWCyGWCwmzGx8P8Z+J2PjLyu7Ox1IxvfPf2fGn9hrPYB6L1IoFOTQLAXbpGNIXRt/RzNB0nkihEtXpZn9fvXVV/GjH/0IgUBAZkENDw9jeHgY0WgUXV1dmJ6elsoDv08f4uxRMWZF+SwWi0Wy1YSW6WZwY/KHnznoejQmC4Dixm9jM7jxLGKzM9cxE20Oh0OgztTl6dOnce7cOYTDYXi9XqyuruLhw4d49OgRkskkHj9+jLm5ORQKBdTX1wvbaqFQKAraWQXfq43UFRVtYw+j3xHYuQJnJAgAnoWpaSguUNxMzuRidXU1HA4HTpw4gTNnzqC2thYtLS3w+/3o6+tDb28v4vE4RkdHxQ+inaS/Q2ZX3vPm5ibm5+cFjcMMPBPMu5XDWpM7iTHQ1bZT69FIUkKdsk+0qakJPp8Pr7zyCl5//XX4fD60tbXBarXiwYMH6Orqkp48kjWxSsRgiWK2t/X9Gs/FfD7/DNTKGBAbk0f70ZP+M9elGQsuzxszW2l23rBHlucNALzxxhv40z/9U/j9fkQiEWxubqKvr0/2dldXl/SNUmesxBDlwmfnfRYKBanKstKj4WradzOeQzxvmJA/VFpqi8UifS0rKysCJ3G73aipqUF1dTU6OztRKBQwNDQkD8wNxsOvo6MDDQ0NWF9fx9DQEKLRqFyDtNaBQAAvvfQSfvCDHxRNTo/FYrh//75pVYBVGa/XC4/HIwqYmpoSmuB0Oi2VDrfbjebmZoRCIWSzWQkQOFmb1M2r/6+9L+1t67jef7gvIinKkihR1GbZsiWv8Na4CxqgToIW+QD9GP1EfRUUSIC2eZc26GI0TdDCjl3IrqNIsqyFFEVRpEiJixaKuv8XxjM6HF9uIp3+/sZ9AMM2yXvv3DMzZz9nDg+xsrKCeDyO69ev4/Lly3j27Fm75HuDlnLjchJl8SJwuhHkBmToNhgMIhwOo1KpYGNjA7lcTt2f4VQaIz//+c8RCAQQDocBAJlMBnNzczWMm+/v8/lU6Jvf83BZRpDkdW63G+FwGLFYDEdHR4jH40o4Si8olUvDMBAKhRAKhTr2BLfKKMjwG/XE55rS78mIl8fjwfT0NB48eKDWPIVzMplEKpVCPp9XudRSCTAM81bpZs9vFRRS7XrqmoFMRx+fTP2qJyBlPrE84ZmGI432kZER3L17F+FwWLWiXl9fV50Z4/E4Njc30dvbq+ryaNRIoaaP00xQSQPBDJKOejSuU8h0GymAuMdlp0Pp0aQSSoVEKi/AqYI/MDCAmzdvoq+vD36/HycnJ0gmk3j69Cmy2awqYuZ+5R6UoHCUdR5SsOgGqxREBI0d0l+vE2oX3A/S62hm8JgZkoRU1KXnXB5gKufh/Pnz+MUvflFTrM/zyjY2NpBMJlXUUc6hpI+ZB5jvQmNHHjwrx1SPB3QjWmZmtMr0Shq8Zo1LpJKuG7asL2FxvdPpxOTkJG7cuKGit8fHx9jc3MTc3Jxq6U0DJxgM1hhZPLLCLELTKo80i+TLOeoUzSI8jYwxOQ9yf8nxsWFDMBhUadNsjx4IBLCzs4Pnz59jZ2cHmUxGHQrO8/LYwU0aVcCpAs75ZuaKrN9sFd2iZSOQzmZjkzJP1q9I54jdbldRnZs3b+Kjjz5SB4weHR1hc3MTjx8/Voda7+7u1hidlFuEjCDpY+T3Zg0C6kF3bHcDvI+UJdLgr3dQez15w8/45+LFi/jVr36lHO+Hh4fY2trCixcvkMvlkEgkFH+kTKORaCYXZJYY02ZlvSVpLlNXCdofeqOLemjL4OGJqvTWZDIZpYCQSWazWczNzaFarSKbzb5RPEWmxk433IASbrcb4+PjGBkZQSQSqVnUR0dHCIfDmJ6eRqFQwNbWFo6OjpSHhN1KZF5yIBDA1NSUikxsb2+jXC4jnU5jb28PhmFgfX0d29vbiEQisNvtSCaT2Nvbw/DwMMbGxmC329XJxlNTU5iamupYoBO6oiOjIfweOFVUpFeI78HF6/P5lMeDyjkbPZARMB3D6/UiGo2iWCyqmh8KwFKphK2tLXi9XpUe53Q6MTs7i5OTE6ytrSkvEgsZ8/k87PbX3bKY1kjll2F5t9utQqE+n09Z+0+ePOkKLc0gPfj1GhxIOjMMzvmg4RaJRBAOhxGJRNDT0wO3241CoQDDOD2wlSczM+1FTyugoiXTu7qBbhk6ZiDTJ/2A2m5Fcp3qKQW8DoBKI2Uq4PDwMAYGBuD1elEqlVAqlbC+vo7FxUWsr68rZsqIIAURFUS2RNYVXTnfRCtRQPkOndKrlftJxUiP8Mhr5bjpufZ6vZienkYoFMLMzAyGhobQ09OjvFyMVjKtmPVnsiuUBCNRVLqoKFEJ19cx55bzIVNLZBF5N9DJnEjhL411fu5wvD5vZ2ZmBv39/bhw4cIbOfvFYlEdRsjWtbrxKCPBzVLFqJzJfSPrTOpdd1Zwr9IBYTY+nUfq4P6hoiQN0IODA2SzWXg8HnUuGflkIBBQ6apUfEqlkmqNznvIiAzp3401RF4hefnbAvlko3kETmkp6xb1jAI2c2IWweTk68Os2UCDGRflchnFYhGlUkk9X0ZreAQF5Y3kL2bNHlrF26Sl7GCm01HOJ2vRzPgmeZff70c0GsXo6Ci8Xi9yuZyKcsjmC5Rjcm+QPnqEp5n+0Ar06F8n0J0t8n66k0o2HtD5QCN5w66V4XAYExMTal3JGqr9/X2USiW1LuU9OD/1ghSSn3BP6E4ByZd151KrjuK2DJ6enh7cvn0b3333Hf7zn/8oZZdpL0xdY3cqvgy9Z4ZhqHSe3d1dLC4uwjAMFfoifD4fZmZmVAtGChEeOjg4OIh79+4hlUqhUCjUtNCkMSYn/datW/joo4/gdDqxvLyMhYUFVbNis9mwvLwMm82m+tsfHx/j5cuX2Nvbw7Vr1xAMBuH3+/Gzn/1MnQ1Ab2qnoDKhhzilAkRwg8tFsL+/r86z4aGDsm7n7t27uHDhgipkPjk5QalUUt9PTU0hnU6rDi8ck/QIsC7o8uXL+OCDD+ByufDw4UMVrWAx6ObmJnK5nDKmuHiPjo7Q39+P8fFx9PT0qL/JeGw2G37/+993TMt6YJEg360ROB8MkTK063A4MDExgbGxMYyPj6Ovrw8nJydIp9Mol8tYWlrC3Nwctre3sbq6ikKhoFIzJHOTp5g3Mr7Ogrdl9LDjkiyy5XvIhhFkolKh5BwzpczhcGBkZATDw8M4f/48YrEYqtUqUqkUisUiFhYW8OjRI+zs7KhoIueOHkxGEMgodSFk5glqhzadKpeys5juEdS9g41SA3WlGDg9cdzn8+HevXuYnp5WLVYZ1aJjqFwuo1QqqfpIeuLNaseojFJRoGJB754UhDKSSAVNKrRUJOpFMtuFWWRHQgp1HWYKk2xe4HQ60dfXhw8//BAzMzO4dOnSGwZPLpfDysqKOiCTTjLg9JBqm82mah6bKTCyJpPvV6+7YCvv3wxMx2UzILN7mTke9fHpTgOui2KxiIODAxWNYMR2YmKiJgWTjrRCoaC86bwP/5ZZDt04647z4nA4TA+I7SZ0nmi2Dmh06sYc1yTP2WJX2pmZGVy8eBGzs7Nqn1HeFgoF7O3tIZfLvaFDUWmURzPQaSSfyfTAs9D5bckbyl7yKfkcPfVSXyP8N9OjQqEQLly4oBpObW5uqoZMrLvlH73xktQbmr1zu7SQUelODB7OsXQqkl+YRXR13qO/g248Snnz3nvv4dKlS7h69aqSv5TtNpsNhUJBrUn9TC3eT282Q11L1vERMnIuDV1Zj00HDvlFM7Rl8LDDB70I9MYwH5oeRR6c5/V6azo06Rtc9y6QObJJAXNYdWPALOWE95dt9AiOiR3DAoFAze+kt47jJQHL5bLq5kZmxnF2slDrpc3IBSoVDD00KT0S8rcAlJLN1qqDg4PqdGvpfZf358Iy825I7yMXleyCIzebLEqXhhyNY9awcKO2clhUN3BWhs4ULL/fj/7+flXMTOZI4UMFU3aXAd48BVkK925Cp3c3IRVeM2aqe2fkfuX1DFf7/X4MDg4iGo0iGAy+MX5GJmgcyfC7FEhmzJwGUDMPayPIe56VlrJmRP5f7jF572bKPK+lgs48aBbh0uur8xTdW8bPeD/9t3IOpbdT5xeSb5hdbzb+twmdj5kpQPrvKbt8Pp9Kge7r61PpV5wrucfN0kD0e5pFT34IGjSC2Rw2gpm84X0k5F6nYk0e2dPTU+PwkhFtrj8q7zpN69GxXejv8TbShyTqydZWaElQPwmFQqp7LRtnkL/LqLZcd83GU28v6ND1jx8a9fiI1FPq/Y4gr+RRJGZ8krSUXULNxtIKzPSwHxJSJuup3ABM+WIrY6Xc0fc2976eMinvresG+pjkv3W5KA0bnX/WW8+tvE9b2qbX68WlS5dUbY5sb0pPIhcQcyfD4TCKxaI6NFCG1PRzFCYnJ3Hr1i1Eo1G8//77mJqagtfrValBzP1nzmA2m1VMlDnAZps/k8ngm2++gdfrRSAQwP3795HJZLC2tqY8+Cyo8vl8KiJlt9uxsbGBQqFQ0zCA5wroVmyrsNtfd17Ru6/JSWYdj2EYqjiUijUtW9lilr89PDzE0NCQOgyTER6mjvFZAFShKM8kCgaDStlk3RW96Ywc/etf/1JGysTEhDpFl+OVFrlUkHK5HHZ3d2G32zE/P6/oKQ+q/F9DMgsyQRqNo6Oj+OCDDzA7OwuXy4Xt7W0YxmnInYfmHh4eor+/H6FQyNTTQTQT6Loy2Qw8kfgsB5jKZ5o9S+4tycjoWZIRST6fdKQBSDqOjIzg448/xuXLlxEOh5HL5VR0kp4etsEkHVkTJYuBWZsmGTq7GJVKJRVpbBey2P4s+5t1c2w7SqVaCmp6E5vNK5VCACpa2N/fj+HhYUSjUVy5cgXT09MqDVe/loKKB7MynYi1FjQOaeDQASXP7tANHRlNYfRe1sXJyB7T6zo5a0tfk2ZGFvcg+aQ02KSRItOqj4+PMTAwgKmpKUSjUUxOTiIWi8Htdqs1yXeTXmSZIqSvLxmt0xVejvd/AcMwVIMZQo+GybExUlXvnBZeS74QCAQwNDSE0dFRfPzxx+rU9Ww2q96fxfInJydwu90YGhpCIBBQckEfi/7Mes6CepC1FzLbhHJQj4i0g3prUu5rft8qLYlIJIKrV69iZGQEly9fxtTUFAzDwMbGhnKkMUuDHnCuSbNoQaMmPfo4eH+mseqO426jHh1lZIff01kN1F8f8jse1Do4OIgbN27g9u3bKgLHdzs8PMTe3h4SiQQKhcKZnGRc2wwAtEqvbhlIkv8Bp0dbkN+zFIGf8Xmy5bx8F309Mko2OjqK27dv486dO3C5XCgWizX7iSnmMtrElvfUM81owwgP2+BTf6CuLR25epfXduhNtGXwOJ1O5XGg0sOON7pyR6WEhzHqNQtysCR6b28vzp8/j5GREYyNjSEWi6kwvAxvscsQa1EA1Hh/dZTLZayvr6uD+fr7+2EYBlKpFE5OTmq6z1CYUWFgC035XuxK1igNoRE4yWbealmgy+9kLj3Ba6WCxnQSn8+HkZERRKNRDA8PIxKJAKhlCryHPNuEqVb8jewgxLD4xsYGHA4HYrGYMmalEsRnSEWY6RJ6G2+eDaRvsk7RiYKhh4ZdLhfC4bBKybt48aI6VEven5GJarWqIpulUqmjdtvteIZppHdy2GM9upkJUikg+Rt5Wrj0ohmGoc71GRgYwIULF3DlyhXVfp5Mmt43Clp2xZMFkOzSYjYembJ11jUlDbmzgDThGDkvbFpBmrQ6t6Qz9z+Vy0gkoniZdGbo1/J93G63cmToxopOy0a8VN6bTiGzejQ+t1M02stm3nsqfvxMzw4ATtek2+1W2QShUAiBQAAAVNowZYGkhUyn0FFPoP9fMHjM0iblGuS/uX5lzY8OSceTkxO1t9nZbnZ2Fvl8XvFIPp8KFh1+Nput5aMdOL+tKjh8Dz6b4+xkbzeDXhfRDi15jd/vRyQSQSQSUQ5jtvAGoO6ld37UPfhEK3tZH4/Z+TVvA43kjfxc0pFRGd2pYPYOHo9H8cuRkRH1vXS883xAdhFrNl4zGp8lLa2bvEA+WzrrpcFq1sTHDDotebxLKBTC8PAwRkdHUSwWUSwWlYzm+tMbPFDumN1XgnxbRtmk/JAOt04N8LYk0u7uLv7yl79gZWVFMZJyuQyn04lIJIILFy6gUCggkUjg+Ph1W1vm7VL49/f3qx7ogUAAlUoFq6ur2N3dhdvtxrlz5+DxePDixQvV2piCfmZmBl6vF4VCQRkrbGu8vb39Rotq4uDgAJlMBsViURX+yfQsdkA5OjrC6uoqACijK5VKqeYKHEsul8OrV6/OrFzSiypPYqcC4vf71SF30lCkB52MiCcpk46GYWBvbw+Hh4fo6enBuXPn4PV6EY/HVaSG3udoNAqn06mKRyuVCkKhkErVkilnUtBIhW1ra0vlDtNDPzk5qQ5D5fzwHjSedKONykWnIP0oDNphKGQGUnBwbnhY67lz51QKhtfrxeDgICqViiqol54T1kh1Em2Rmxyo9ajzc/mu3SgUN4zTFFXdmOEzuBZlS23+MUvT4t8DAwO4fv26OqSMjS3YzpbCTNblFItF5YkiqEBKocc1Ri+29FzJ/GCORyomZsp+JwdmyvuTdtzHfGajwlez+0lQiHi9XpX2IqNirHNktJFGpSy0B2pzyPk56+443mYwM9yk40avhTkLdG8u+Z9OF9JdpprWW5McJ1Ne6LTj/qLwLZVK6kyocrlcw5PlfXXvsj4u/dlmyocZz5Jz9DaMJbOx8f9m7yK/p6xiE5rh4WEMDg4qhdzn82FgYECdc8KUX7ZE5jkdMvqn720AyqtPmku663tbfyeua/K0bqxH+Yx6/zf7PZ3D0gDTxysdh9KADwQCykHKmsZcLoe1tTXs7e0pR5uePm3mGGo2ThmtbfZe7Tjk6j2v1b0t+b1M5+P3HA9p2NPTg6GhIQwMDCgHOSM8/D+zBmQaa6N3NXtnfaxck4wi18Pb2ttST5RrjJ/x73qOWL4lf2EuAAAUF0lEQVQnjY1IJILZ2VmMjY0puQ1AlZpQzqRSKWxubmJ3d7cm64rPZy2opIvUJ2WTDeC0uZmc40YyqdWMgrYMnlwuhz/84Q81xKPicvXqVVy7dg1ra2vqdN9sNoudnR21OD0ej4o8sGsXle7d3V0VgbHZbHj69Kkq/Pb5fMq65Km48Xgcvb29uHPnDoLBIJ49e1bX4GHLYI/Hg6GhISUQ2e3o1q1buHbtGh49eoQvvvgCHo8HDx48wPj4OJ48eYJkMlnDOLa3t9s6oVjHycnJG5NC71MwGEQoFFLFX2RAcoGylqq3txdut1sZcFxIgUAAAwMDcLlcePnyZY13i20tQ6GQSjV0u92IRCJKcdrZ2VEMWm5Mjt0wDFXXRI9CT08PLl26hKmpKSwuLqrOcRTu8tBSohlTaAcul0uFT9tRKBnB0g9V5T3Y5WVwcBAOhwOVSkW1ZS+Xy6oImHRhp0KzcDHQnmdHv16e2AycKgGk41k8TfrzZOcVdqqjEikbLbBzX7NxE9FoFPfv30dfXx9cLhf29vYwMDCAvr4+JagqlUoNw9PpSCWAvz08PFTjBYBSqaQ8oRSeetokU2llLrxEvVzudiDXH9cEFbl21jvXlfTe0nPJTlj9/f2qw93h4aHqQJnNZpWSyS5OOh3pyOCZWDyDgQe9tjo+XfmX3r5OnRlma6neHmJ0URo8ZtfIqBnXBxUVHkNQLpeRyWSwt7eninF5PoecQ7kmzdIUdaWO/IbKr6Shfl9Jv7PKmno0a0VJb2Tw2O12hMNhBAIBRKNRjI+PY3h4WCk2dLpxT1YqFRSLRdX0IZVK1TRQkA4Wpm5zTdKZoRc7y72tj5V1u/wdM0Raefdugs9ieqnZntF/C5zSg/zN6Xx9uGMymUS1WsX29jYWFhZqzmHTr+U9W3lf/qbViJDM4Dgr2tnbzbJpdKMnFAphfHwcQ0NDqsEDO6tWq1V19iCbNzUzeHjvRmPlWnO5XDXd48zuQyedWXS8E0ijRhoUjOybpV3KcUneaLfb1dERg4ODqg11T08PgsEg9vf3kUqllD4ej8cVjwRQU3bBtGq2otcd6FxzbrdbyehW6UKe6vf7YbPZumfwUNHRP2PK0u7urmJirOEJBAJKieaCYHSCwoICnCkEDocDoVAIbrdbCZ6TkxN8//33CIfD2NraUoYAvejNNgSJSgZss9kwOTmpPPiBQEBtBjJsniGgg0KRytVZIT053EwM/ZOJ2e12lbZCzw5TAoLBYM0mpKLBjcvIi93+ulU0ozmrq6sIBALIZrNqMzDXUzJiGV6UHii5UYLBIKLRKAKBACKRCHp7e+HxeNQC5hpIJpPI5XI11zJCBZz9cEI51kZ1EY2KVXUBJJmBzJGW9VX0/CaTSWXYs/5JRuLkH7Nn8RkUHo2UbXmtzjTaTfmoB+lJkQpkqzUn0hPG+wG1h4PJNEx2gclkMiiVSurA1noCQwpySVP+Wy+SlMyU1zVSAnQFtl2Qfvo8tett1e8lFRKpBMvvWduYz+exvb2t0n51OtLTJiO3uofZrNjUbHz1lBad7j8EzLy/jX4L1M43jVIaiRsbG8hms+owQplCTcjrzebXbG/LPabvY32MHBfTD7sFM+VORj2b7Xca8lRM5Jrn3iGP3NzcRCaTUXuckVgzI0zKM7l3ZKqVdL6Z0UTf47xHM4X2rJB8T45bjtGM78gxyTVAOSPT27kuNzY2kMlksLOzY9rFTI6hlfFKGrUDOR//K+iyVYJ1K0yLlgbawcEB4vE40uk00um0MqY7lZ1AbVqj5DFA7ZyYGfrd2t8ypVe2yuf7t8of+S7c2zLNjBHw9fV1pNNpdayJmaNJGmHSkWO2R1rl32dFV1pkVatVLC4uYmNjQ6VR+P1+fPjhh7h37x7m5ubw+eef4/j4WLWspLFSqVQwMDCgDKFcLoe+vj789Kc/xblz5/CnP/0JX3/9NSqVCv785z/DMAzE43FUq1UUCgU8e/asJtTWCJVKBcvLy9jY2MCtW7fwm9/8BoFAAB6PB3a7XRX/u91uxGIxTE9P4+XLlzWM0mazYWpqCtevX8eXX355ZprRONFbCrI+hJa/z+fDL3/5S/z4xz/G8+fP8cUXX6BSqWBiYgLRaBR7e3tIp9M4Pj6uyZc8ODiA3+/HjRs3cO7cOfzjH//AN998g0qlgq+//hrA64NEafGn02kAp4XaMt2MxqkU7j6fD16vF3fu3MGvf/3rmo5b8Xgc5XIZfr8f77//Pi5duoSHDx8ikUiodCG73Y5YLIaJiQk4HA789a9/PTMtgdqCUZ1x6a0sZeEbP6MXnkyBzIebnAdmMcKYz+eRSCTw6aefYmVlBclkEpubm6ppB1BbX8Vn8cBYyfBkYSsjGnIs0qmgC1ZZy8W6oU7pSG+QPoZGBhnfQ8+R53tS6DDK2NfXp0LhiUQCn332GVZXV7GysqJSYvWwu4w6ykge1ylTvSQd9TaYQOOCUdLRZrOdqUaP8ySfoYfwW4XeRhZATX0SU4QozPL5PL788kssLy9jbW0NiURCRcL0e7D2jntG5u3LyF6jKB7HIt+LBpkZ3d82dONQBz/XFWsKYYfDofZ2PB7HH//4R6yuriKZTGJjY8N0TXLdUYDrjQHM9vbBwcEb0QZ9nrm3q9Wqigh1urcJ2bSCz2eKN52azdKajo+PVWYG97Ssn2OjkfX1dXz22Wd49eoVUqkUUqmUKR113kIljenVso6UKa6N1pjcfzIq1+2uoKSlVP5lvZJs+KKPjdEbrgk2OaHcYASLrbxXV1fxySefYGlpCevr66b8ge+s01I6NbgmJU+ngwloLRuhW/LmrJDyBjhdL3Tw9PT0YHR0FENDQwgGg4qnV6tVJJNJfPLJJ3j+/Dny+bxKw2pUbysdio34Cxu+SPrT6JCOQ+4TZqYAnTXSIOhoYIZGT0+P0uVaMSbkGq5UKsjn80gmk+p+oVBIOd4XFxfx29/+Ft9//71qXmXmhJANsBiJkfuC/EY+vx1ZyTXcSu1ux7ufD2AhEz9zOp2IxWK4cuUKstmsytHnBFOhZ5E9ANUIwDAMRCIRxGIxdVhUPp9HKpWqyecn09XHIgmhf8f0BIfDgdnZWfT29iKbzaJUKikvPlMbgsGgYmYyasICLrM0rXZAD470UshUIcMwFB2vXr2KQqGgQvwsJCOjogXOfHQyt76+PgwNDcHlcmFnZwf7+/s1dSdysciNyOfL38iGBBx3f38/ZmdnEQwGFR2Zb2yznZ5t1N/fX9N4gtGngYGBrnjeGqVzSa+CGVOTjL7ZWKhE5/N5pNNpLC0tYWlpCaVS6Y1QKg1a3tswjBoacn3yd2Y52HymHKcZulUk3omXy6zgX3otOUcU6qVSSR16+/z5c8zPz6v0LDNIj1W1Wq0RIpw7nY7tes26QUf9mWf1VkljiZD1fGybLw2geDyO5eVlZDKZuhFos/tKhUh6b3WDxuwas89/6OhOo/E0+630ZpbLZeRyOWxvb2NpaQnLy8soFAp1HWp6hEgH15OkR6upp9Ip0s1ie2ng6UZgI6eGPjYa0kwfo4eXShcjjcvLy1hcXFTnQjW6J1AbFTPb22bGZSM0cnB0Cs5NI1rWoyffSRrgZo6mo6MjlSWzsLCA+fn5ul2vCLl2dDkiO7FxjK3W7elj/1+CupqkGenGjrt0Zsv3LBaLWFpawn//+9+2n9lsD+rzzbWrZ19IftttOtKwYde0ZutQjol/c39x7bGpA2UuM6UWFhbw7NmzpvelXkn9lPPWKr9phlYjVx1ROhgM4vz586qVs91uV9af0+nE7u4u5ufnsbu7qzqupVIpldO7v78Pl8uFWCyGWCyG0dFRRCIR+P1+FYk5OTnBe++9h3Q6jUePHiGTydQsIHqlotEoIpGImqjj42Ok02nkcjn09vaq5gZMrdra2sJXX30Fj8eDRCKhmPP4+DjcbjcWFhaQyWRwcHCA999/X9X8cOIeP358Zu8GLXt6n/x+P4aGhtTmZApaKpWCw+HAq1ev8NVXX+HVq1eqDoAeMwpol8uFiYkJhMNhTE5OqnnZ2tpS7aDv3LmDTCaDb7/9FsVisUbAsNamv78fsVhM5VGenJyog0cDgQAGBwfV+A4PD7G+vo7PP/8cHo9HfRaPxxGJROB2u/H06VOsra1hZ2cHP/rRj1RXFCpu8/PzHRk8ZBjc5JIJ0hCUBqvOsDgXXE8ysgO8rtd6/Pgxent7kU6n0dfXh/39fezv7yOTySCZTKJcLtcYUlIBonDm+9rtdnWugkxPksLIMIyaDlgcU72aCD6nWyeTc/xkxByDFHJSQOppO5KOHNvq6ir+/ve/IxgMYn5+XrXtzufz2NraQiKRqEtHvUMj6aYXf0ulgWkCpBk9ptKbKueAz7Db7R01LSBYF0KvIwUQnQHkWzJVknNPJwZbfcq1VCwW8eLFC8TjcRweHqrCcKYFLiwsIJvNKuObKcN8r0qloiKejMRIJVVGfeiUkGNi3Yv8jB5p8mM6tjj2s7bvl/Mq1wJwqljIdSq7BOpOG96HNGEUYn5+HhsbGygWi+jr60O5XEahUEAul0MikUCxWKyJIvD5ck74ve4UstlsNbV1vNYszc1svNxDVNS6tbdlSpNMJ+G8mu1tKXNlxNJms2Fvbw8rKyvI5XL43e9+h0gkorqr7uzsqJR0Peog9500kqkQyWfpe1vyeY6NNOOzuD7k3u6ka6ZOS91BJnl1I1pKfkajkes4l8vhxYsX2NjYQLVaxeDgYA2fTCaTSg9pRkvyl3q05PiA0xpiWWeoN3nQadlOrWwjOsrxS7ndaG/LvSUNHb5LIpHA3/72NwQCAczNzakaEpfLhWQyia2trZbGp+9VOaZ6jj3p3JPOBQm5drtRw6PXIXM8jJAyqEB+L7NeyMer1aoqSeGa5d7O5/P49NNPMTg4qOrLt7a23qBjI3nDtUknnT4mKVsYAWpV3rRqgHdk8IRCIdy8eRP9/f2K4Ds7O1haWlLhsBcvXmB/fx9jY2Mol8tYWFjA1taWmpBwOKxOEx4aGkI0GsXx8TEWFxdRKpXg9/vxk5/8BIlEAsvLy6r/t9PprCnYGx0dxdWrV5UywdShXC6HcDiM69evw+FwKM9TKpXCw4cPYRiGMm7GxsZw+fJlAMB3332H/f19XLt2DQ8ePIBhGCpC8u233+LRo0cdtaV2Op1qQQSDQYyMjKC3txeBQAA+n6+mlmFxcVEVezI8v7y8rBQpwzDQ29uLe/fu4eLFixgbG8PFixdxfHyshLbL5cLdu3exvr6OJ0+e1IRPme/qcrkwMDCAWCxWc0bP6uoq8vm8aitMRY7fJRIJxYAMw0AwGMTw8DCOj4+VYXjjxg3cv38f1WpVjenly5eqqcJZQcVXGjdsdU36SoEomRQZJdeurAnjNel0GqlUCjabDf/85z+Vd4wnQTNaJu8pmRmZJdepVHr5GX8jFTp6QuhlkQq+7k3m/buhFFGRkEoxo45kPtLDqr8nBaY8+8LhcGBlZQWbm5twuVzo6+uDx+NRjLNSqai/JR05B9J4oFHHk56l50wqRWR+9HL5/X709vaiWq2qzjKsQSCTdjgcNeH1TuB2u9VZW3QcsFaRz6ABwXehE4TCh15KqdwVCgVsbm7C6XRifn5epZWwTahekMpuWk6nU61VfiYVWAo7Ca/Xqw6Q5JiYJiGvk6kTVELYTKUbBo9ck0y3Ix+U61Q3YAHU5I6TB5CW5Kk2mw3//ve/1bOodOmd7XRllc+k8apHsIHTFrhy7Fy3pJfcQ2b57JJXdIuO3Cu8dyM6kvew+5Se1rO7u6u6dT5//lwpH3I9y2skHbn2ubcBqM9knVMjHknaUlEiXUlb7m3uxW5AOik4tlZpyVQsmZ7Hd9jZ2VHyenFxUXWlbcQnpVOHsoV8kp/p6xioPShcnnHIz6QThg4Q0rJbDYfkmqSDhMquVMpltE82t5AGjzQu4vE41tbWFF34OcfeCk+StOWzZBmClMHSGKLcZpo897u8r0zN7pa88fv96v+GYShHtTyLjXMuz9Ahbzeb093dXaysrGBtbQ3Pnz9X/LxQKJhGWZvJG3a89Hg8CIVCitfKMXGuj4+P68ob2ajrBzN45ALjQpBMXzI7Mgg93YELpZ7nCagNXfK5uuLK3/D38jdynFx4cmzMV6QXm9a57umQbYG72VlDCjy+h6QFFUmdbvL/UqhLWkovolT8JXQvaKMUDUlDjoOGju5Zk4uZDFO/R6vpHc1gNtZ2vqv3G8lo9Q5wXD/17tvouWcdd6ufdQs6fZrRi5AKEdeG7BQjPUD1ctHNxmHmsW91/HJtN3vPbngu9eeY8S39b5neYgZJSwpUHqLXaCzy73rja3TtWd6tm+uy3r10Pt8OJG+UEWIpA9oZk9ncNVpH3aZRp2i01xuNVRpnMuXsLM81o1cznqevgXr7rNvoRK4Q+vtS3lAZ5v5uxiebve9ZaNDKfTrlk42e24psrjcGvaaDOgcN6VbH3Yxu+pptxKfOcv920Eh2nVU/0h0vQG3ZRaP7NZMHrdKkHu8505puZ8HabLZtAGttP+XdxYRhGIPtXmTR0RQWLbsDi47dQ9u0tOhoCmtNdgcWHbsHi5bdgUXH7sGSN91BXTq2ZfBYsGDBggULFixYsGDBwv9PeDuN6S1YsGDBggULFixYsGDh/wAsg8eCBQsWLFiwYMGCBQvvLCyDx4IFCxYsWLBgwYIFC+8sLIPHggULFixYsGDBggUL7ywsg8eCBQsWLFiwYMGCBQvvLCyDx4IFCxYsWLBgwYIFC+8sLIPHggULFixYsGDBggUL7ywsg8eCBQsWLFiwYMGCBQvvLCyDx4IFCxYsWLBgwYIFC+8s/h/0ahxvfYdQFgAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1152x432 with 10 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "n_cfs = np.array([len(explanation.all[iter_cf]) for iter_cf in range(max_lam_steps)])\n",
    "examples = {}\n",
    "for ix, n in enumerate(n_cfs):\n",
    "    if n>0:\n",
    "        examples[ix] = {'ix': ix, 'lambda': explanation.all[ix][0]['lambda'],\n",
    "                       'X': explanation.all[ix][0]['X']}\n",
    "columns = len(examples) + 1\n",
    "rows = 1\n",
    "\n",
    "fig = plt.figure(figsize=(16,6))\n",
    "\n",
    "for i, key in enumerate(examples.keys()):\n",
    "    ax = plt.subplot(rows, columns, i+1)\n",
    "    ax.get_xaxis().set_visible(False)\n",
    "    ax.get_yaxis().set_visible(False)\n",
    "    plt.imshow(examples[key]['X'].reshape(28,28))\n",
    "    plt.title(f'Iteration: {key}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Typically, the first few iterations find counterfactuals that are out of distribution, while the later iterations make the counterfactual more sparse and interpretable."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's now try to steer the counterfactual to a specific class:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Explanation took 6.249 sec\n"
     ]
    }
   ],
   "source": [
    "target_class = 1\n",
    "\n",
    "cf = Counterfactual(cnn, shape=shape, target_proba=target_proba, tol=tol,\n",
    "                    target_class=target_class, max_iter=max_iter, lam_init=lam_init,\n",
    "                    max_lam_steps=max_lam_steps, learning_rate_init=learning_rate_init,\n",
    "                    feature_range=feature_range)\n",
    "\n",
    "explanation = start_time = time()\n",
    "explanation = cf.explain(X)\n",
    "print('Explanation took {:.3f} sec'.format(time() - start_time))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Results:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Counterfactual prediction: 1 with probability 0.9999160766601562\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "pred_class = explanation.cf['class']\n",
    "proba = explanation.cf['proba'][0][pred_class]\n",
    "\n",
    "print(f'Counterfactual prediction: {pred_class} with probability {proba}')\n",
    "plt.imshow(explanation.cf['X'].reshape(28, 28));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As you can see, by specifying a class, the search process can't go towards the closest class to the test instance (in this case a 9 as we saw previously), so the resulting counterfactual might be less interpretable. We can gain more insight by looking at the difference between the counterfactual and the original instance:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPsAAAD4CAYAAAAq5pAIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAOoklEQVR4nO3df6hXdZ7H8dc707rlaJq7enFuqzsUGkVqF1maiLYxaQIx/6kxGF2IdYgJZmDAIqGJfoDIzgzzxyLoZno312FgxhSK3XFViJEYu4Wm5ZZuGSr36oxCk/gNV33vH/cYt7zfz7n3e873e77e9/MBl+/3nvf3fM+7g6/O957POd+PubsAjH7XVN0AgNYg7EAQhB0IgrADQRB2IIhrW7mxjo4OnzhxYis3OSpcf/31yfqXX37Zok6u1NnZmaz39fW1qBNI0ueff65arWZD1QqF3cwekvRrSWMk/Zu7r069fuLEiVq2bFmRTYY0e/bsZP3QoUMt6uRKq1atStZffvnlFnUCSerp6alba/hjvJmNkfSvkr4v6XZJS83s9kbfD0BzFfmbfb6kI+7+ibufl/QbSYvLaQtA2YqEfbqkY4N+P54t+xozW2FmvWbWW6vVCmwOQBFNPxvv7uvcvdvduzs6Opq9OQB1FAn7CUldg37/drYMQBsqEvZ3JN1qZjPNbJykH0jaXk5bAMrW8NCbu18ws6ck/ZcGht42uPsHpXWGr1Q5tJaH6yauHoXG2d39TUlvltQLgCbiclkgCMIOBEHYgSAIOxAEYQeCIOxAEC29nx2td8016f+fX7p0KVm/++67k/UNGzaMuCdUgyM7EARhB4Ig7EAQhB0IgrADQRB2IAiG3ka5vKG1PI899liyvnLlykLvj5Fbs2ZN3dquXbvq1jiyA0EQdiAIwg4EQdiBIAg7EARhB4Ig7EAQjLMHt3DhwqpbuCqlxrqlYtcfPPfcc8n6a6+9Vrd25syZujWO7EAQhB0IgrADQRB2IAjCDgRB2IEgCDsQBOPswS1YsCBZf/XVV1vUSXvJG0dvphdeeKHhdc+dO1e3VijsZnZU0heSLkq64O7dRd4PQPOUcWT/R3f/SwnvA6CJ+JsdCKJo2F3SH8zsXTNbMdQLzGyFmfWaWW+tViu4OQCNKvox/l53P2Fmfytph5n9j7u/NfgF7r5O0jpJmjZtmhfcHoAGFTqyu/uJ7PGUpK2S5pfRFIDyNRx2M7vRzL51+bmkhZIOltUYgHIV+Rg/VdJWM7v8Pv/h7v9ZSldoG4cOHaq6haaYPXt2ofWvxu/Lbzjs7v6JpLtK7AVAEzH0BgRB2IEgCDsQBGEHgiDsQBDc4lqCt99+O1nv7OxM1seMGZOsd3V1jbiny7Kh0bpSU/xK+b1dvHhxxD21yi233FK31t2dvkFz27ZtZbdTOY7sQBCEHQiCsANBEHYgCMIOBEHYgSAIOxAE4+wlOHbsWLKeN06+ZcuWZP3BBx9M1lNfHzxhwoTkuu7pLw/as2dPsn7NNenjxdmzZ+vW7rvvvuS6e/fuTdbzrl9IXWOwe/fu5Lp5/11Xo9H3XwRgSIQdCIKwA0EQdiAIwg4EQdiBIAg7EATj7CVYtGhRsn7DDTck63nj6HfccUeyvnHjxrq18ePHJ9edNWtWsr5///5kfebMmcl66quoJ06cmFy3t7c3WZ8/Pz0nyU033VS3lnd9wWjEkR0IgrADQRB2IAjCDgRB2IEgCDsQBGEHgrBWjjdOmzbNly1b1rLtjRY333xzsn769OkWddJaqXvhpWLf15937cLVqqenR/39/UPeyJ97ZDezDWZ2yswODlo22cx2mNnh7HFSmQ0DKN9wPsZvlPTQN5Y9I2mnu98qaWf2O4A2lht2d39L0plvLF4saVP2fJOkR0ruC0DJGj1BN9Xd+7Ln/ZKm1nuhma0ws14z663Vag1uDkBRhc/G+8AZvrpn+dx9nbt3u3t3R0dH0c0BaFCjYT9pZp2SlD2eKq8lAM3QaNi3S1qePV8uafTNbwuMMrn3s5vZFkn3S5piZscl/VzSakm/NbMnJH0m6dFmNhndaB1Hz5N3L/7HH3+crE+ZMqVuLW/e+tF4v3tu2N19aZ3S90ruBUATcbksEARhB4Ig7EAQhB0IgrADQfBV0sE98MADyfquXbuatu0ZM2Yk60eOHEnW582bl6zPnTu3bm00Dq3l4cgOBEHYgSAIOxAEYQeCIOxAEIQdCIKwA0Ewzh5cM8fR8xw9ejRZ7+/vT9bPnTtXYjejH0d2IAjCDgRB2IEgCDsQBGEHgiDsQBCEHQiCcXY0Veormzdv3pxc97bbbkvWFyxYkKxHvGc9hSM7EARhB4Ig7EAQhB0IgrADQRB2IAjCDgTBODuaKjXW/fjjjyfXzbvfnXH0kck9spvZBjM7ZWYHBy173sxOmNm+7Ofh5rYJoKjhfIzfKOmhIZb/yt3nZD9vltsWgLLlht3d35J0pgW9AGiiIifonjKz97OP+ZPqvcjMVphZr5n11mq1ApsDUESjYV8r6TuS5kjqk/SLei9093Xu3u3u3R0dHQ1uDkBRDYXd3U+6+0V3vyRpvaT55bYFoGwNhd3MOgf9ukTSwXqvBdAecsfZzWyLpPslTTGz45J+Lul+M5sjySUdlfSjJvaIq1hqLPyjjz5Krjtr1qyy2wktN+zuvnSIxa80oRcATcTlskAQhB0IgrADQRB2IAjCDgTBLa4oJPVV0VJ66O3SpUtltzMq5O3T1K3Bb7zxRt0aR3YgCMIOBEHYgSAIOxAEYQeCIOxAEIQdCIJxdiQtWbIkWd+6dWuyfvBg/a86uPPOOxvqabRbtWpVsv7SSy/VrZ0+fbpujSM7EARhB4Ig7EAQhB0IgrADQRB2IAjCDgTBODuSXn/99ULrM5Y+chMmTGjK+3JkB4Ig7EAQhB0IgrADQRB2IAjCDgRB2IEgGGcf5Yp8r/tw6nnv//TTT9etrV69OrluVCtXrmzK++Ye2c2sy8x2m9mHZvaBmf0kWz7ZzHaY2eHscVJTOgRQiuF8jL8g6Wfufrukf5D0YzO7XdIzkna6+62Sdma/A2hTuWF39z53fy97/oWkQ5KmS1osaVP2sk2SHmlWkwCKG9EJOjObIWmupD9JmurufVmpX9LUOuusMLNeM+ut1WoFWgVQxLDDbmbjJf1O0k/d/a+Daz5wFmfIMznuvs7du929u6Ojo1CzABo3rLCb2VgNBH2zu/8+W3zSzDqzeqekU81pEUAZcofebGBs5RVJh9z9l4NK2yUtl7Q6e9zWlA6vAmvWrCm0frOGWqT8obM8+/fvT9bvueeeZH3y5Ml1a3n7bf369cn64cOHk3V83XDG2b8r6YeSDpjZvmzZsxoI+W/N7AlJn0l6tDktAihDbtjd/Y+S6l058b1y2wHQLFwuCwRB2IEgCDsQBGEHgiDsQBDc4lqCZo6TD0fqNtO8cfYLFy4k63fddVeyfu7cuWQ9tW+uvTb9z2/evHnJOkaGIzsQBGEHgiDsQBCEHQiCsANBEHYgCMIOBHFVjbN3dnbWrfX19dWtjXZF7lnPG+tu5rbzxvj37t3b8HvjShzZgSAIOxAEYQeCIOxAEIQdCIKwA0EQdiCIq2qcPTWWnjde3NXVlax/+umnDfXUCnnTIp8/f75ubezYsU3ddtHvpUfrcGQHgiDsQBCEHQiCsANBEHYgCMIOBEHYgSCGMz97l6QeSVMluaR17v5rM3te0j9L+nP20mfd/c1mNZon797odh5Hz5M3lj1u3LiG12UcPY7hXFRzQdLP3P09M/uWpHfNbEdW+5W7/0vz2gNQluHMz94nqS97/oWZHZI0vdmNASjXiP5mN7MZkuZK+lO26Ckze9/MNpjZpDrrrDCzXjPrrdVqhZoF0Lhhh93Mxkv6naSfuvtfJa2V9B1JczRw5P/FUOu5+zp373b37o6OjhJaBtCIYYXdzMZqIOib3f33kuTuJ939ortfkrRe0vzmtQmgqNyw28Dp2lckHXL3Xw5aPvirXpdIOlh+ewDKMpyz8d+V9ENJB8xsX7bsWUlLzWyOBobjjkr6UVM6HKbp09PnDBctWpSsHzhwIFnfs2fPiHsqSzOHxxhaq8aLL75Yt3bdddc1/L67du2qWxvO2fg/ShrqX1tlY+oARo4r6IAgCDsQBGEHgiDsQBCEHQiCsANBWCvHWadNm+bLli1r2fZQvSeffLJube3atS3sJIaenh719/cPeWEGR3YgCMIOBEHYgSAIOxAEYQeCIOxAEIQdCKKl4+xm9mdJnw1aNEXSX1rWwMi0a2/t2pdEb40qs7e/c/e/GarQ0rBfsXGzXnfvrqyBhHbtrV37kuitUa3qjY/xQBCEHQii6rCvq3j7Ke3aW7v2JdFbo1rSW6V/swNonaqP7ABahLADQVQSdjN7yMw+MrMjZvZMFT3UY2ZHzeyAme0zs96Ke9lgZqfM7OCgZZPNbIeZHc4eh5xjr6LenjezE9m+22dmD1fUW5eZ7TazD83sAzP7Sba80n2X6Ksl+63lf7Ob2RhJH0t6UNJxSe9IWuruH7a0kTrM7Kikbnev/AIMM7tP0llJPe5+R7ZsjaQz7r46+x/lJHd/uk16e17S2aqn8c5mK+ocPM24pEck/ZMq3HeJvh5VC/ZbFUf2+ZKOuPsn7n5e0m8kLa6gj7bn7m9JOvONxYslbcqeb9LAP5aWq9NbW3D3Pnd/L3v+haTL04xXuu8SfbVEFWGfLunYoN+Pq73me3dJfzCzd81sRdXNDGGqu/dlz/slTa2ymSHkTuPdSt+YZrxt9l0j058XxQm6K93r7vMkfV/Sj7OPq23JB/4Ga6ex02FN490qQ0wz/pUq912j058XVUXYT0jqGvT7t7NlbcHdT2SPpyRtVftNRX3y8gy62eOpivv5SjtN4z3UNONqg31X5fTnVYT9HUm3mtlMMxsn6QeStlfQxxXM7MbsxInM7EZJC9V+U1Fvl7Q8e75c0rYKe/madpnGu94046p431U+/bm7t/xH0sMaOCP/v5JWVdFDnb7+XtL+7OeDqnuTtEUDH+v+TwPnNp6QdLOknZIOS/pvSZPbqLd/l3RA0vsaCFZnRb3dq4GP6O9L2pf9PFz1vkv01ZL9xuWyQBCcoAOCIOxAEIQdCIKwA0EQdiAIwg4EQdiBIP4fo+eAbo5MKLsAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow((explanation.cf['X'] - X).reshape(28, 28));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This shows that the counterfactual is stripping out the top part of the 7 to make to result in a prediction of 1 - not very surprising as the dataset has a lot of examples of diagonally slanted 1’s."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Clean up:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "os.remove('mnist_cnn.h5')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.14"
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
